2019-05-30 20:12:56 +00:00
// Copyright 2019 Google LLC.
# include "include/core/SkCanvas.h"
# include "include/core/SkColorFilter.h"
# include "include/core/SkColorPriv.h"
2020-03-27 19:40:37 +00:00
# include "include/core/SkFontMgr.h"
2019-05-30 20:12:56 +00:00
# include "include/core/SkGraphics.h"
# include "include/core/SkPath.h"
# include "include/core/SkRegion.h"
# include "include/core/SkShader.h"
# include "include/core/SkStream.h"
# include "include/core/SkTextBlob.h"
# include "include/core/SkTime.h"
# include "include/core/SkTypeface.h"
# include "include/effects/SkGradientShader.h"
# include "include/utils/SkRandom.h"
# include "modules/skparagraph/include/Paragraph.h"
2019-06-17 14:34:10 +00:00
# include "modules/skparagraph/include/TypefaceFontProvider.h"
2019-05-30 20:12:56 +00:00
# include "modules/skparagraph/src/ParagraphBuilderImpl.h"
# include "modules/skparagraph/src/ParagraphImpl.h"
2019-06-19 17:32:01 +00:00
# include "modules/skparagraph/utils/TestFontCollection.h"
2019-06-18 13:58:02 +00:00
# include "samplecode/Sample.h"
2019-05-30 20:12:56 +00:00
# include "src/core/SkOSFile.h"
# include "src/shaders/SkColorShader.h"
2019-10-09 13:43:02 +00:00
# include "src/utils/SkOSPath.h"
2019-05-30 20:12:56 +00:00
# include "src/utils/SkUTF.h"
# include "tools/Resources.h"
using namespace skia : : textlayout ;
namespace {
2019-07-23 14:11:03 +00:00
class ParagraphView_Base : public Sample {
protected :
2019-07-30 17:32:08 +00:00
sk_sp < TestFontCollection > getFontCollection ( ) {
// If we reset font collection we need to reset paragraph cache
static sk_sp < TestFontCollection > fFC = nullptr ;
if ( fFC = = nullptr ) {
2019-10-09 13:43:02 +00:00
fFC = sk_make_sp < TestFontCollection > ( GetResourcePath ( " fonts " ) . c_str ( ) , false , true ) ;
2019-07-30 17:32:08 +00:00
}
return fFC ;
2019-07-23 14:11:03 +00:00
}
} ;
2019-05-30 20:12:56 +00:00
sk_sp < SkShader > setgrad ( const SkRect & r , SkColor c0 , SkColor c1 ) {
SkColor colors [ ] = { c0 , c1 } ;
SkPoint pts [ ] = { { r . fLeft , r . fTop } , { r . fRight , r . fTop } } ;
return SkGradientShader : : MakeLinear ( pts , colors , nullptr , 2 , SkTileMode : : kClamp ) ;
}
2019-10-09 13:43:02 +00:00
/*
void writeHtml ( const char * name , Paragraph * paragraph ) {
SkString tmpDir = skiatest : : GetTmpDir ( ) ;
if ( ! tmpDir . isEmpty ( ) ) {
SkString path = SkOSPath : : Join ( tmpDir . c_str ( ) , name ) ;
SkFILEWStream file ( path . c_str ( ) ) ;
file . write ( nullptr , 0 ) ;
}
}
*/
2019-05-30 20:12:56 +00:00
} // namespace
2019-07-23 14:11:03 +00:00
class ParagraphView1 : public ParagraphView_Base {
2019-05-30 20:12:56 +00:00
protected :
2019-07-03 14:55:44 +00:00
SkString name ( ) override { return SkString ( " Paragraph1 " ) ; }
2019-05-30 20:12:56 +00:00
void drawTest ( SkCanvas * canvas , SkScalar w , SkScalar h , SkColor fg , SkColor bg ) {
const std : : vector <
std : : tuple < std : : string , bool , bool , int , SkColor , SkColor , bool , TextDecorationStyle > >
gParagraph = { { " monospace " , true , false , 14 , SK_ColorWHITE , SK_ColorRED , true ,
TextDecorationStyle : : kDashed } ,
{ " Assyrian " , false , false , 20 , SK_ColorWHITE , SK_ColorBLUE , false ,
TextDecorationStyle : : kDotted } ,
{ " serif " , true , true , 10 , SK_ColorWHITE , SK_ColorRED , true ,
TextDecorationStyle : : kDouble } ,
{ " Arial " , false , true , 16 , SK_ColorGRAY , SK_ColorGREEN , true ,
TextDecorationStyle : : kSolid } ,
{ " sans-serif " , false , false , 8 , SK_ColorWHITE , SK_ColorRED , false ,
TextDecorationStyle : : kWavy } } ;
SkAutoCanvasRestore acr ( canvas , true ) ;
canvas - > clipRect ( SkRect : : MakeWH ( w , h ) ) ;
canvas - > drawColor ( SK_ColorWHITE ) ;
SkScalar margin = 20 ;
SkPaint paint ;
paint . setAntiAlias ( true ) ;
paint . setColor ( fg ) ;
SkPaint blue ;
blue . setColor ( SK_ColorBLUE ) ;
TextStyle defaultStyle ;
defaultStyle . setBackgroundColor ( blue ) ;
defaultStyle . setForegroundColor ( paint ) ;
ParagraphStyle paraStyle ;
2019-07-30 17:32:08 +00:00
auto fontCollection = sk_make_sp < FontCollection > ( ) ;
fontCollection - > setDefaultFontManager ( SkFontMgr : : RefDefault ( ) ) ;
2019-05-30 20:12:56 +00:00
for ( auto i = 1 ; i < 5 ; + + i ) {
defaultStyle . setFontSize ( 24 * i ) ;
paraStyle . setTextStyle ( defaultStyle ) ;
2019-06-21 16:22:32 +00:00
ParagraphBuilderImpl builder ( paraStyle , fontCollection ) ;
2019-05-30 20:12:56 +00:00
std : : string name = " Paragraph: " + std : : to_string ( 24 * i ) ;
2019-09-27 19:16:13 +00:00
builder . addText ( name . c_str ( ) , name . length ( ) ) ;
2019-05-30 20:12:56 +00:00
for ( auto para : gParagraph ) {
TextStyle style ;
style . setFontFamilies ( { SkString ( std : : get < 0 > ( para ) . c_str ( ) ) } ) ;
SkFontStyle fontStyle ( std : : get < 1 > ( para ) ? SkFontStyle : : Weight : : kBold_Weight
: SkFontStyle : : Weight : : kNormal_Weight ,
SkFontStyle : : Width : : kNormal_Width ,
std : : get < 2 > ( para ) ? SkFontStyle : : Slant : : kItalic_Slant
: SkFontStyle : : Slant : : kUpright_Slant ) ;
style . setFontStyle ( fontStyle ) ;
style . setFontSize ( std : : get < 3 > ( para ) * i ) ;
SkPaint background ;
background . setColor ( std : : get < 4 > ( para ) ) ;
style . setBackgroundColor ( background ) ;
SkPaint foreground ;
foreground . setColor ( std : : get < 5 > ( para ) ) ;
foreground . setAntiAlias ( true ) ;
style . setForegroundColor ( foreground ) ;
if ( std : : get < 6 > ( para ) ) {
style . addShadow ( TextShadow ( SK_ColorBLACK , SkPoint : : Make ( 5 , 5 ) , 2 ) ) ;
}
auto decoration = ( i % 4 ) ;
if ( decoration = = 3 ) {
decoration = 4 ;
}
bool test = ( TextDecoration ) decoration ! = TextDecoration : : kNoDecoration ;
std : : string deco = std : : to_string ( ( int ) decoration ) ;
if ( test ) {
style . setDecoration ( ( TextDecoration ) decoration ) ;
style . setDecorationStyle ( std : : get < 7 > ( para ) ) ;
style . setDecorationColor ( std : : get < 5 > ( para ) ) ;
}
builder . pushStyle ( style ) ;
std : : string name = " " + std : : get < 0 > ( para ) + " " +
( std : : get < 1 > ( para ) ? " , bold " : " " ) +
( std : : get < 2 > ( para ) ? " , italic " : " " ) + " " +
std : : to_string ( std : : get < 3 > ( para ) * i ) +
( std : : get < 4 > ( para ) ! = bg ? " , background " : " " ) +
( std : : get < 5 > ( para ) ! = fg ? " , foreground " : " " ) +
( std : : get < 6 > ( para ) ? " , shadow " : " " ) +
( test ? " , decorations " + deco : " " ) + " ; " ;
2019-09-27 19:16:13 +00:00
builder . addText ( name . c_str ( ) , name . length ( ) ) ;
2019-05-30 20:12:56 +00:00
builder . pop ( ) ;
}
auto paragraph = builder . Build ( ) ;
paragraph - > layout ( w - margin * 2 ) ;
paragraph - > paint ( canvas , margin , margin ) ;
canvas - > translate ( 0 , paragraph - > getHeight ( ) ) ;
}
}
void onDrawContent ( SkCanvas * canvas ) override {
drawTest ( canvas , this - > width ( ) , this - > height ( ) , SK_ColorRED , SK_ColorWHITE ) ;
}
private :
typedef Sample INHERITED ;
} ;
2019-07-23 14:11:03 +00:00
class ParagraphView2 : public ParagraphView_Base {
2019-05-30 20:12:56 +00:00
protected :
2019-07-03 14:55:44 +00:00
SkString name ( ) override { return SkString ( " Paragraph2 " ) ; }
2019-05-30 20:12:56 +00:00
void drawCode ( SkCanvas * canvas , SkScalar w , SkScalar h ) {
SkPaint comment ;
comment . setColor ( SK_ColorGRAY ) ;
SkPaint constant ;
constant . setColor ( SK_ColorMAGENTA ) ;
SkPaint null ;
null . setColor ( SK_ColorMAGENTA ) ;
SkPaint literal ;
literal . setColor ( SK_ColorGREEN ) ;
SkPaint code ;
code . setColor ( SK_ColorDKGRAY ) ;
SkPaint number ;
number . setColor ( SK_ColorBLUE ) ;
SkPaint name ;
name . setColor ( SK_ColorRED ) ;
SkPaint white ;
white . setColor ( SK_ColorWHITE ) ;
TextStyle defaultStyle ;
defaultStyle . setBackgroundColor ( white ) ;
defaultStyle . setForegroundColor ( code ) ;
defaultStyle . setFontFamilies ( { SkString ( " monospace " ) } ) ;
defaultStyle . setFontSize ( 30 ) ;
ParagraphStyle paraStyle ;
paraStyle . setTextStyle ( defaultStyle ) ;
2019-06-21 16:22:32 +00:00
auto fontCollection = sk_make_sp < FontCollection > ( ) ;
fontCollection - > setDefaultFontManager ( SkFontMgr : : RefDefault ( ) ) ;
ParagraphBuilderImpl builder ( paraStyle , fontCollection ) ;
2019-05-30 20:12:56 +00:00
2019-09-27 19:16:13 +00:00
const char * text1 = " RaisedButton " ;
const char * text2 = " ( \n " ;
const char * text3 = " child: " ;
const char * text4 = " const " ;
const char * text5 = " Text " ;
const char * text6 = " 'BUTTON TITLE' " ;
const char * text7 = " ), \n " ;
2019-05-30 20:12:56 +00:00
builder . pushStyle ( style ( name ) ) ;
2019-09-27 19:16:13 +00:00
builder . addText ( text1 , strlen ( text1 ) ) ;
2019-05-30 20:12:56 +00:00
builder . pop ( ) ;
2019-09-27 19:16:13 +00:00
builder . addText ( text2 , strlen ( text2 ) ) ;
builder . addText ( text3 , strlen ( text3 ) ) ;
2019-05-30 20:12:56 +00:00
builder . pushStyle ( style ( constant ) ) ;
2019-09-27 19:16:13 +00:00
builder . addText ( text4 , strlen ( text4 ) ) ;
2019-05-30 20:12:56 +00:00
builder . pop ( ) ;
2019-09-27 19:16:13 +00:00
builder . addText ( " " , 1 ) ;
2019-05-30 20:12:56 +00:00
builder . pushStyle ( style ( name ) ) ;
2019-09-27 19:16:13 +00:00
builder . addText ( text5 , strlen ( text5 ) ) ;
2019-05-30 20:12:56 +00:00
builder . pop ( ) ;
2019-09-27 19:16:13 +00:00
builder . addText ( " ( " , 1 ) ;
2019-05-30 20:12:56 +00:00
builder . pushStyle ( style ( literal ) ) ;
2019-09-27 19:16:13 +00:00
builder . addText ( text6 , strlen ( text6 ) ) ;
2019-05-30 20:12:56 +00:00
builder . pop ( ) ;
2019-09-27 19:16:13 +00:00
builder . addText ( text7 , strlen ( text7 ) ) ;
2019-05-30 20:12:56 +00:00
auto paragraph = builder . Build ( ) ;
paragraph - > layout ( w - 20 ) ;
paragraph - > paint ( canvas , 20 , 20 ) ;
}
TextStyle style ( SkPaint paint ) {
TextStyle style ;
paint . setAntiAlias ( true ) ;
style . setForegroundColor ( paint ) ;
style . setFontFamilies ( { SkString ( " monospace " ) } ) ;
style . setFontSize ( 30 ) ;
return style ;
}
2019-06-21 16:22:32 +00:00
void drawText ( SkCanvas * canvas , SkScalar w , SkScalar h , std : : vector < const char * > & text ,
2019-05-30 20:12:56 +00:00
SkColor fg = SK_ColorDKGRAY , SkColor bg = SK_ColorWHITE ,
const char * ff = " sans-serif " , SkScalar fs = 24 ,
size_t lineLimit = 30 ,
const std : : u16string & ellipsis = u " \u2026 " ) {
SkAutoCanvasRestore acr ( canvas , true ) ;
canvas - > clipRect ( SkRect : : MakeWH ( w , h ) ) ;
canvas - > drawColor ( bg ) ;
SkScalar margin = 20 ;
SkPaint paint ;
paint . setAntiAlias ( true ) ;
paint . setColor ( fg ) ;
SkPaint blue ;
blue . setColor ( SK_ColorBLUE ) ;
SkPaint background ;
background . setColor ( bg ) ;
TextStyle style ;
style . setBackgroundColor ( blue ) ;
style . setForegroundColor ( paint ) ;
style . setFontFamilies ( { SkString ( ff ) } ) ;
style . setFontStyle ( SkFontStyle ( SkFontStyle : : kMedium_Weight ,
SkFontStyle : : kNormal_Width ,
SkFontStyle : : kUpright_Slant ) ) ;
style . setFontSize ( fs ) ;
ParagraphStyle paraStyle ;
paraStyle . setTextStyle ( style ) ;
paraStyle . setMaxLines ( lineLimit ) ;
paraStyle . setEllipsis ( ellipsis ) ;
TextStyle defaultStyle ;
defaultStyle . setFontSize ( 20 ) ;
paraStyle . setTextStyle ( defaultStyle ) ;
2019-07-30 17:32:08 +00:00
ParagraphBuilderImpl builder ( paraStyle , getFontCollection ( ) ) ;
2019-05-30 20:12:56 +00:00
SkPaint foreground ;
foreground . setColor ( fg ) ;
style . setForegroundColor ( foreground ) ;
style . setBackgroundColor ( background ) ;
for ( auto & part : text ) {
builder . pushStyle ( style ) ;
2019-09-27 19:16:13 +00:00
builder . addText ( part , strlen ( part ) ) ;
2019-05-30 20:12:56 +00:00
builder . pop ( ) ;
}
auto paragraph = builder . Build ( ) ;
paragraph - > layout ( w - margin * 2 ) ;
paragraph - > paint ( canvas , margin , margin ) ;
canvas - > translate ( 0 , paragraph - > getHeight ( ) + margin ) ;
}
void drawLine ( SkCanvas * canvas , SkScalar w , SkScalar h , const std : : string & text ,
TextAlign align ) {
SkAutoCanvasRestore acr ( canvas , true ) ;
canvas - > clipRect ( SkRect : : MakeWH ( w , h ) ) ;
canvas - > drawColor ( SK_ColorWHITE ) ;
SkScalar margin = 20 ;
SkPaint paint ;
paint . setAntiAlias ( true ) ;
paint . setColor ( SK_ColorBLUE ) ;
SkPaint gray ;
gray . setColor ( SK_ColorLTGRAY ) ;
TextStyle style ;
style . setBackgroundColor ( gray ) ;
style . setForegroundColor ( paint ) ;
style . setFontFamilies ( { SkString ( " Arial " ) } ) ;
style . setFontSize ( 30 ) ;
ParagraphStyle paraStyle ;
paraStyle . setTextStyle ( style ) ;
paraStyle . setTextAlign ( align ) ;
2019-06-21 16:22:32 +00:00
auto fontCollection = sk_make_sp < FontCollection > ( ) ;
fontCollection - > setDefaultFontManager ( SkFontMgr : : RefDefault ( ) ) ;
ParagraphBuilderImpl builder ( paraStyle , fontCollection ) ;
2019-09-27 19:16:13 +00:00
builder . addText ( text . c_str ( ) , text . length ( ) ) ;
2019-05-30 20:12:56 +00:00
auto paragraph = builder . Build ( ) ;
paragraph - > layout ( w - margin * 2 ) ;
paragraph - > layout ( w - margin ) ;
paragraph - > paint ( canvas , margin , margin ) ;
canvas - > translate ( 0 , paragraph - > getHeight ( ) + margin ) ;
}
void onDrawContent ( SkCanvas * canvas ) override {
2019-06-21 16:22:32 +00:00
std : : vector < const char * > cupertino = {
2019-05-30 20:12:56 +00:00
" google_logogoogle_gsuper_g_logo 1 "
" google_logogoogle_gsuper_g_logo 12 "
" google_logogoogle_gsuper_g_logo 123 "
" google_logogoogle_gsuper_g_logo 1234 "
" google_logogoogle_gsuper_g_logo 12345 "
" google_logogoogle_gsuper_g_logo 123456 "
" google_logogoogle_gsuper_g_logo 1234567 "
" google_logogoogle_gsuper_g_logo 12345678 "
" google_logogoogle_gsuper_g_logo 123456789 "
" google_logogoogle_gsuper_g_logo 1234567890 "
" google_logogoogle_gsuper_g_logo 123456789 "
" google_logogoogle_gsuper_g_logo 12345678 "
" google_logogoogle_gsuper_g_logo 1234567 "
" google_logogoogle_gsuper_g_logo 123456 "
" google_logogoogle_gsuper_g_logo 12345 "
" google_logogoogle_gsuper_g_logo 1234 "
" google_logogoogle_gsuper_g_logo 123 "
" google_logogoogle_gsuper_g_logo 12 "
" google_logogoogle_gsuper_g_logo 1 "
" google_logogoogle_gsuper_g_logo "
" google_logogoogle_gsuper_g_logo "
" google_logogoogle_gsuper_g_logo "
" google_logogoogle_gsuper_g_logo "
" google_logogoogle_gsuper_g_logo "
" google_logogoogle_gsuper_g_logo " } ;
2019-06-21 16:22:32 +00:00
std : : vector < const char * > text = {
2019-05-30 20:12:56 +00:00
" My neighbor came over to say, \n "
" Although not in a neighborly way, \n \n "
" That he'd knock me around, \n \n \n "
" If I didn't stop the sound, \n \n \n \n "
" Of the classical music I play. " } ;
2019-06-21 16:22:32 +00:00
std : : vector < const char * > long_word = {
2019-05-30 20:12:56 +00:00
" A_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_ "
" very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_ "
" very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_ "
" very_very_very_very_very_very_very_long_text " } ;
2019-06-21 16:22:32 +00:00
std : : vector < const char * > very_long = {
2019-05-30 20:12:56 +00:00
" A very very very very very very very very very very very very very very very very "
" very very very very very very very very very very very very very very very very "
" very very very very very very very very very very very very very very very very "
" very very very very very very very long text " } ;
2019-06-21 16:22:32 +00:00
std : : vector < const char * > very_word = {
2019-05-30 20:12:56 +00:00
" A very_very_very_very_very_very_very_very_very_very "
" very_very_very_very_very_very_very_very_very_very very very very very very very "
" very very very very very very very very very very very very very very very very "
" very very very very very very very very very very very very very long text " } ;
SkScalar width = this - > width ( ) / 5 ;
SkScalar height = this - > height ( ) ;
drawText ( canvas , width , height , long_word , SK_ColorBLACK , SK_ColorWHITE , " Google Sans " , 30 ) ;
canvas - > translate ( width , 0 ) ;
drawText ( canvas , width , height , very_long , SK_ColorBLACK , SK_ColorWHITE , " Google Sans " , 30 ) ;
canvas - > translate ( width , 0 ) ;
drawText ( canvas , width , height , very_word , SK_ColorBLACK , SK_ColorWHITE , " Google Sans " , 30 ) ;
canvas - > translate ( width , 0 ) ;
drawText ( canvas , width , height / 2 , text , SK_ColorBLACK , SK_ColorWHITE , " Roboto " , 20 , 100 ,
u " \u2026 " ) ;
canvas - > translate ( 0 , height / 2 ) ;
drawCode ( canvas , width , height / 2 ) ;
canvas - > translate ( width , - height / 2 ) ;
drawText ( canvas , width , height , cupertino , SK_ColorBLACK , SK_ColorWHITE , " Google Sans " , 30 ) ;
}
private :
typedef Sample INHERITED ;
} ;
2019-07-23 14:11:03 +00:00
class ParagraphView3 : public ParagraphView_Base {
2019-05-30 20:12:56 +00:00
protected :
2019-07-03 14:55:44 +00:00
SkString name ( ) override { return SkString ( " Paragraph3 " ) ; }
2019-05-30 20:12:56 +00:00
void drawLine ( SkCanvas * canvas , SkScalar w , SkScalar h , const std : : string & text ,
TextAlign align , size_t lineLimit = std : : numeric_limits < size_t > : : max ( ) ,
bool RTL = false , SkColor background = SK_ColorGRAY ,
const std : : u16string & ellipsis = u " \u2026 " ) {
SkAutoCanvasRestore acr ( canvas , true ) ;
canvas - > clipRect ( SkRect : : MakeWH ( w , h ) ) ;
canvas - > drawColor ( SK_ColorWHITE ) ;
SkScalar margin = 20 ;
SkPaint paint ;
paint . setAntiAlias ( true ) ;
paint . setColor ( SK_ColorBLACK ) ;
SkPaint gray ;
gray . setColor ( background ) ;
SkPaint yellow ;
yellow . setColor ( SK_ColorYELLOW ) ;
TextStyle style ;
style . setBackgroundColor ( gray ) ;
style . setForegroundColor ( paint ) ;
style . setFontFamilies ( { SkString ( " sans-serif " ) } ) ;
style . setFontSize ( 30 ) ;
ParagraphStyle paraStyle ;
paraStyle . setTextStyle ( style ) ;
paraStyle . setTextAlign ( align ) ;
paraStyle . setMaxLines ( lineLimit ) ;
paraStyle . setEllipsis ( ellipsis ) ;
// paraStyle.setTextDirection(RTL ? SkTextDirection::rtl : SkTextDirection::ltr);
2019-06-21 16:22:32 +00:00
auto fontCollection = sk_make_sp < FontCollection > ( ) ;
fontCollection - > setDefaultFontManager ( SkFontMgr : : RefDefault ( ) ) ;
ParagraphBuilderImpl builder ( paraStyle , fontCollection ) ;
2019-05-30 20:12:56 +00:00
if ( RTL ) {
builder . addText ( mirror ( text ) ) ;
} else {
builder . addText ( normal ( text ) ) ;
}
canvas - > drawRect ( SkRect : : MakeXYWH ( margin , margin , w - margin * 2 , h - margin * 2 ) , yellow ) ;
auto paragraph = builder . Build ( ) ;
paragraph - > layout ( w - margin * 2 ) ;
paragraph - > paint ( canvas , margin , margin ) ;
}
std : : u16string mirror ( const std : : string & text ) {
std : : u16string result ;
result + = u " \u202E " ;
// for (auto i = text.size(); i > 0; --i) {
// result += text[i - 1];
//}
for ( auto i = text . size ( ) ; i > 0 ; - - i ) {
auto ch = text [ i - 1 ] ;
if ( ch = = ' , ' ) {
result + = u " ! " ;
} else if ( ch = = ' . ' ) {
result + = u " ! " ;
} else {
result + = ch ;
}
}
result + = u " \u202C " ;
return result ;
}
std : : u16string normal ( const std : : string & text ) {
std : : u16string result ;
result + = u " \u202D " ;
for ( auto ch : text ) {
result + = ch ;
}
result + = u " \u202C " ;
return result ;
}
void onDrawContent ( SkCanvas * canvas ) override {
const std : : string options = // { "open-source open-source open-source open-source" };
{ " Flutter is an open-source project to help developers "
" build high-performance, high-fidelity, mobile apps for "
" iOS and Android "
" from a single codebase. This design lab is a playground "
" and showcase of Flutter's many widgets, behaviors, "
" animations, layouts, and more. " } ;
canvas - > drawColor ( SK_ColorDKGRAY ) ;
SkScalar width = this - > width ( ) / 4 ;
SkScalar height = this - > height ( ) / 2 ;
const std : : string line =
" World domination is such an ugly phrase - I prefer to call it world optimisation " ;
drawLine ( canvas , width , height , line , TextAlign : : kLeft , 1 , false , SK_ColorLTGRAY ) ;
canvas - > translate ( width , 0 ) ;
drawLine ( canvas , width , height , line , TextAlign : : kRight , 2 , false , SK_ColorLTGRAY ) ;
canvas - > translate ( width , 0 ) ;
drawLine ( canvas , width , height , line , TextAlign : : kCenter , 3 , false , SK_ColorLTGRAY ) ;
canvas - > translate ( width , 0 ) ;
drawLine ( canvas , width , height , line , TextAlign : : kJustify , 4 , false , SK_ColorLTGRAY ) ;
canvas - > translate ( - width * 3 , height ) ;
drawLine ( canvas , width , height , line , TextAlign : : kLeft , 1 , true , SK_ColorLTGRAY ) ;
canvas - > translate ( width , 0 ) ;
drawLine ( canvas , width , height , line , TextAlign : : kRight , 2 , true , SK_ColorLTGRAY ) ;
canvas - > translate ( width , 0 ) ;
drawLine ( canvas , width , height , line , TextAlign : : kCenter , 3 , true , SK_ColorLTGRAY ) ;
canvas - > translate ( width , 0 ) ;
drawLine ( canvas , width , height , line , TextAlign : : kJustify , 4 , true , SK_ColorLTGRAY ) ;
canvas - > translate ( width , 0 ) ;
}
private :
typedef Sample INHERITED ;
} ;
2019-07-23 14:11:03 +00:00
class ParagraphView4 : public ParagraphView_Base {
2019-05-30 20:12:56 +00:00
protected :
2019-07-03 14:55:44 +00:00
SkString name ( ) override { return SkString ( " Paragraph4 " ) ; }
2019-05-30 20:12:56 +00:00
void drawFlutter ( SkCanvas * canvas , SkScalar w , SkScalar h ,
const char * ff = " Google Sans " , SkScalar fs = 30 ,
size_t lineLimit = std : : numeric_limits < size_t > : : max ( ) ,
const std : : u16string & ellipsis = u " \u2026 " ) {
SkAutoCanvasRestore acr ( canvas , true ) ;
canvas - > clipRect ( SkRect : : MakeWH ( w , h ) ) ;
SkScalar margin = 20 ;
SkPaint black ;
black . setAntiAlias ( true ) ;
black . setColor ( SK_ColorBLACK ) ;
SkPaint blue ;
blue . setAntiAlias ( true ) ;
blue . setColor ( SK_ColorBLUE ) ;
SkPaint red ;
red . setAntiAlias ( true ) ;
red . setColor ( SK_ColorRED ) ;
SkPaint green ;
green . setAntiAlias ( true ) ;
green . setColor ( SK_ColorGREEN ) ;
SkPaint gray ;
gray . setColor ( SK_ColorLTGRAY ) ;
SkPaint yellow ;
yellow . setColor ( SK_ColorYELLOW ) ;
SkPaint magenta ;
magenta . setAntiAlias ( true ) ;
magenta . setColor ( SK_ColorMAGENTA ) ;
TextStyle style ;
style . setFontFamilies ( { SkString ( ff ) } ) ;
style . setFontSize ( fs ) ;
TextStyle style0 ;
style0 . setForegroundColor ( black ) ;
style0 . setBackgroundColor ( gray ) ;
style0 . setFontFamilies ( { SkString ( ff ) } ) ;
style0 . setFontSize ( fs ) ;
style0 . setDecoration ( TextDecoration : : kUnderline ) ;
style0 . setDecorationStyle ( TextDecorationStyle : : kDouble ) ;
style0 . setDecorationColor ( SK_ColorBLACK ) ;
TextStyle style1 ;
style1 . setForegroundColor ( blue ) ;
style1 . setBackgroundColor ( yellow ) ;
style1 . setFontFamilies ( { SkString ( ff ) } ) ;
style1 . setFontSize ( fs ) ;
style1 . setDecoration ( TextDecoration : : kOverline ) ;
style1 . setDecorationStyle ( TextDecorationStyle : : kWavy ) ;
style1 . setDecorationColor ( SK_ColorBLACK ) ;
TextStyle style2 ;
style2 . setForegroundColor ( red ) ;
style2 . setFontFamilies ( { SkString ( ff ) } ) ;
style2 . setFontSize ( fs ) ;
TextStyle style3 ;
style3 . setForegroundColor ( green ) ;
style3 . setFontFamilies ( { SkString ( ff ) } ) ;
style3 . setFontSize ( fs ) ;
TextStyle style4 ;
style4 . setForegroundColor ( magenta ) ;
style4 . setFontFamilies ( { SkString ( ff ) } ) ;
style4 . setFontSize ( fs ) ;
ParagraphStyle paraStyle ;
paraStyle . setTextStyle ( style ) ;
paraStyle . setMaxLines ( lineLimit ) ;
paraStyle . setEllipsis ( ellipsis ) ;
const char * logo1 = " google_ " ;
const char * logo2 = " logo " ;
const char * logo3 = " go " ;
const char * logo4 = " ogle_logo " ;
const char * logo5 = " google_lo " ;
const char * logo6 = " go " ;
{
2019-07-30 17:32:08 +00:00
ParagraphBuilderImpl builder ( paraStyle , getFontCollection ( ) ) ;
2019-05-30 20:12:56 +00:00
builder . pushStyle ( style0 ) ;
2019-09-27 19:16:13 +00:00
builder . addText ( logo1 , strlen ( logo1 ) ) ;
2019-05-30 20:12:56 +00:00
builder . pop ( ) ;
builder . pushStyle ( style1 ) ;
2019-09-27 19:16:13 +00:00
builder . addText ( logo2 , strlen ( logo2 ) ) ;
2019-05-30 20:12:56 +00:00
builder . pop ( ) ;
2019-09-27 19:16:13 +00:00
builder . addText ( " " , 1 ) ;
2019-05-30 20:12:56 +00:00
builder . pushStyle ( style0 ) ;
2019-09-27 19:16:13 +00:00
builder . addText ( logo3 , strlen ( logo3 ) ) ;
2019-05-30 20:12:56 +00:00
builder . pop ( ) ;
builder . pushStyle ( style1 ) ;
2019-09-27 19:16:13 +00:00
builder . addText ( logo4 , strlen ( logo4 ) ) ;
2019-05-30 20:12:56 +00:00
builder . pop ( ) ;
2019-09-27 19:16:13 +00:00
builder . addText ( " " , 1 ) ;
2019-05-30 20:12:56 +00:00
builder . pushStyle ( style0 ) ;
2019-09-27 19:16:13 +00:00
builder . addText ( logo5 , strlen ( logo5 ) ) ;
2019-05-30 20:12:56 +00:00
builder . pop ( ) ;
builder . pushStyle ( style1 ) ;
2019-09-27 19:16:13 +00:00
builder . addText ( logo6 , strlen ( logo6 ) ) ;
2019-05-30 20:12:56 +00:00
builder . pop ( ) ;
auto paragraph = builder . Build ( ) ;
paragraph - > layout ( w - margin * 2 ) ;
paragraph - > paint ( canvas , margin , margin ) ;
canvas - > translate ( 0 , h + margin ) ;
}
}
void onDrawContent ( SkCanvas * canvas ) override {
canvas - > drawColor ( SK_ColorWHITE ) ;
SkScalar width = this - > width ( ) ;
SkScalar height = this - > height ( ) ;
drawFlutter ( canvas , width , height / 2 ) ;
}
private :
typedef Sample INHERITED ;
} ;
2019-07-23 14:11:03 +00:00
class ParagraphView5 : public ParagraphView_Base {
2019-05-30 20:12:56 +00:00
protected :
2019-06-21 16:22:32 +00:00
SkString name ( ) override { return SkString ( " Paragraph5 " ) ; }
2019-05-30 20:12:56 +00:00
void bidi ( SkCanvas * canvas , SkScalar w , SkScalar h , const std : : u16string & text ,
const std : : u16string & expected , size_t lineLimit = std : : numeric_limits < size_t > : : max ( ) ,
const char * ff = " Roboto " , SkScalar fs = 30 ,
const std : : u16string & ellipsis = u " \u2026 " ) {
SkAutoCanvasRestore acr ( canvas , true ) ;
canvas - > clipRect ( SkRect : : MakeWH ( w , h ) ) ;
SkScalar margin = 20 ;
SkPaint black ;
black . setColor ( SK_ColorBLACK ) ;
SkPaint gray ;
gray . setColor ( SK_ColorLTGRAY ) ;
TextStyle style ;
style . setForegroundColor ( black ) ;
style . setFontFamilies ( { SkString ( ff ) } ) ;
style . setFontSize ( fs ) ;
TextStyle style0 ;
style0 . setForegroundColor ( black ) ;
style0 . setFontFamilies ( { SkString ( ff ) } ) ;
style0 . setFontSize ( fs ) ;
style0 . setFontStyle ( SkFontStyle ( SkFontStyle : : kNormal_Weight , SkFontStyle : : kNormal_Width ,
SkFontStyle : : kItalic_Slant ) ) ;
TextStyle style1 ;
style1 . setForegroundColor ( gray ) ;
style1 . setFontFamilies ( { SkString ( ff ) } ) ;
style1 . setFontSize ( fs ) ;
style1 . setFontStyle ( SkFontStyle ( SkFontStyle : : kBold_Weight , SkFontStyle : : kNormal_Width ,
SkFontStyle : : kUpright_Slant ) ) ;
ParagraphStyle paraStyle ;
paraStyle . setTextStyle ( style ) ;
paraStyle . setMaxLines ( lineLimit ) ;
paraStyle . setEllipsis ( ellipsis ) ;
2019-07-30 17:32:08 +00:00
ParagraphBuilderImpl builder ( paraStyle , getFontCollection ( ) ) ;
2019-05-30 20:12:56 +00:00
if ( text . empty ( ) ) {
const std : : u16string text0 = u " \u202D abc " ;
const std : : u16string text1 = u " \u202E FED " ;
const std : : u16string text2 = u " \u202D ghi " ;
const std : : u16string text3 = u " \u202E LKJ " ;
const std : : u16string text4 = u " \u202D mno " ;
builder . pushStyle ( style0 ) ;
builder . addText ( text0 ) ;
builder . pop ( ) ;
builder . pushStyle ( style1 ) ;
builder . addText ( text1 ) ;
builder . pop ( ) ;
builder . pushStyle ( style0 ) ;
builder . addText ( text2 ) ;
builder . pop ( ) ;
builder . pushStyle ( style1 ) ;
builder . addText ( text3 ) ;
builder . pop ( ) ;
builder . pushStyle ( style0 ) ;
builder . addText ( text4 ) ;
builder . pop ( ) ;
} else {
// icu::UnicodeString unicode((UChar*) text.data(), SkToS32(text.size()));
// std::string str;
// unicode.toUTF8String(str);
// SkDebugf("Text: %s\n", str.c_str());
builder . addText ( text + expected ) ;
}
auto paragraph = builder . Build ( ) ;
paragraph - > layout ( w - margin * 2 ) ;
paragraph - > paint ( canvas , margin , margin ) ;
}
void onDrawContent ( SkCanvas * canvas ) override {
canvas - > drawColor ( SK_ColorWHITE ) ;
SkScalar width = this - > width ( ) ;
SkScalar height = this - > height ( ) / 8 ;
const std : : u16string text1 =
u " A \u202E NAC \u202C ner, exceedingly \u202E NAC \u202C ny, \n "
" One morning remarked to his granny: \n "
" A \u202E NAC \u202C ner \u202E NAC \u202C \u202E NAC \u202C , \n "
" Anything that he \u202E NAC \u202C , \n "
" But a \u202E NAC \u202C ner \u202E NAC \u202C 't \u202E NAC \u202C a \u202E NAC \u202C , "
" \u202E NAC \u202C he? " ;
bidi ( canvas , width , height * 3 , text1 , u " " , 5 ) ;
canvas - > translate ( 0 , height * 3 ) ;
bidi ( canvas , width , height , u " \u2067 DETALOSI \u2069 " , u " " ) ;
canvas - > translate ( 0 , height ) ;
bidi ( canvas , width , height , u " \u202B DEDDEBME \u202C " , u " " ) ;
canvas - > translate ( 0 , height ) ;
bidi ( canvas , width , height , u " \u202E EDIRREVO \u202C " , u " " ) ;
canvas - > translate ( 0 , height ) ;
bidi ( canvas , width , height , u " \u200F TICILPMI \u200E " , u " " ) ;
canvas - > translate ( 0 , height ) ;
bidi ( canvas , width , height , u " 123 456 7890 \u202E ZYXWV UTS RQP ONM LKJ IHG FED CBA \u202C . " ,
u " " , 2 ) ;
canvas - > translate ( 0 , height ) ;
// bidi(canvas, width, height, u"", u"");
// canvas->translate(0, height);
}
private :
typedef Sample INHERITED ;
} ;
2019-07-23 14:11:03 +00:00
class ParagraphView6 : public ParagraphView_Base {
2019-05-30 20:12:56 +00:00
protected :
2019-06-21 16:22:32 +00:00
SkString name ( ) override { return SkString ( " Paragraph6 " ) ; }
2019-05-30 20:12:56 +00:00
void hangingS ( SkCanvas * canvas , SkScalar w , SkScalar h , SkScalar fs = 60.0 ) {
auto ff = " HangingS " ;
canvas - > drawColor ( SK_ColorLTGRAY ) ;
SkPaint black ;
black . setAntiAlias ( true ) ;
black . setColor ( SK_ColorBLACK ) ;
SkPaint blue ;
blue . setAntiAlias ( true ) ;
blue . setColor ( SK_ColorBLUE ) ;
SkPaint red ;
red . setAntiAlias ( true ) ;
red . setColor ( SK_ColorRED ) ;
SkPaint green ;
green . setAntiAlias ( true ) ;
green . setColor ( SK_ColorGREEN ) ;
SkPaint gray ;
gray . setColor ( SK_ColorCYAN ) ;
SkPaint yellow ;
yellow . setColor ( SK_ColorYELLOW ) ;
SkPaint magenta ;
magenta . setAntiAlias ( true ) ;
magenta . setColor ( SK_ColorMAGENTA ) ;
SkFontStyle fontStyle ( SkFontStyle : : kBold_Weight , SkFontStyle : : kNormal_Width ,
SkFontStyle : : kItalic_Slant ) ;
TextStyle style ;
style . setFontFamilies ( { SkString ( ff ) } ) ;
style . setFontSize ( fs ) ;
style . setFontStyle ( fontStyle ) ;
TextStyle style0 ;
style0 . setForegroundColor ( black ) ;
style0 . setBackgroundColor ( gray ) ;
style0 . setFontFamilies ( { SkString ( ff ) } ) ;
style0 . setFontSize ( fs ) ;
style0 . setFontStyle ( fontStyle ) ;
TextStyle style1 ;
style1 . setForegroundColor ( blue ) ;
style1 . setBackgroundColor ( yellow ) ;
style1 . setFontFamilies ( { SkString ( ff ) } ) ;
style1 . setFontSize ( fs ) ;
style1 . setFontStyle ( fontStyle ) ;
TextStyle style2 ;
style2 . setForegroundColor ( red ) ;
style2 . setFontFamilies ( { SkString ( ff ) } ) ;
style2 . setFontSize ( fs ) ;
style2 . setFontStyle ( fontStyle ) ;
TextStyle style3 ;
style3 . setForegroundColor ( green ) ;
style3 . setFontFamilies ( { SkString ( ff ) } ) ;
style3 . setFontSize ( fs ) ;
style3 . setFontStyle ( fontStyle ) ;
TextStyle style4 ;
style4 . setForegroundColor ( magenta ) ;
style4 . setFontFamilies ( { SkString ( ff ) } ) ;
style4 . setFontSize ( fs ) ;
style4 . setFontStyle ( fontStyle ) ;
ParagraphStyle paraStyle ;
paraStyle . setTextStyle ( style ) ;
const char * logo1 = " S " ;
const char * logo2 = " kia " ;
const char * logo3 = " Sk " ;
const char * logo4 = " ia " ;
const char * logo5 = " Ski " ;
const char * logo6 = " a " ;
{
2019-07-30 17:32:08 +00:00
ParagraphBuilderImpl builder ( paraStyle , getFontCollection ( ) ) ;
2019-05-30 20:12:56 +00:00
builder . pushStyle ( style0 ) ;
2019-09-27 19:16:13 +00:00
builder . addText ( logo1 , strlen ( logo1 ) ) ;
2019-05-30 20:12:56 +00:00
builder . pop ( ) ;
builder . pushStyle ( style1 ) ;
2019-09-27 19:16:13 +00:00
builder . addText ( logo2 , strlen ( logo2 ) ) ;
2019-05-30 20:12:56 +00:00
builder . pop ( ) ;
2019-09-27 19:16:13 +00:00
builder . addText ( " " , 3 ) ;
2019-05-30 20:12:56 +00:00
builder . pushStyle ( style0 ) ;
2019-09-27 19:16:13 +00:00
builder . addText ( logo3 , strlen ( logo3 ) ) ;
2019-05-30 20:12:56 +00:00
builder . pop ( ) ;
builder . pushStyle ( style1 ) ;
2019-09-27 19:16:13 +00:00
builder . addText ( logo4 , strlen ( logo4 ) ) ;
2019-05-30 20:12:56 +00:00
builder . pop ( ) ;
2019-09-27 19:16:13 +00:00
builder . addText ( " " , 3 ) ;
2019-05-30 20:12:56 +00:00
builder . pushStyle ( style0 ) ;
2019-09-27 19:16:13 +00:00
builder . addText ( logo5 , strlen ( logo5 ) ) ;
2019-05-30 20:12:56 +00:00
builder . pop ( ) ;
builder . pushStyle ( style1 ) ;
2019-09-27 19:16:13 +00:00
builder . addText ( logo6 , strlen ( logo6 ) ) ;
2019-05-30 20:12:56 +00:00
builder . pop ( ) ;
auto paragraph = builder . Build ( ) ;
paragraph - > layout ( w ) ;
paragraph - > paint ( canvas , 40 , 40 ) ;
canvas - > translate ( 0 , h ) ;
}
const char * logo11 = " S " ;
const char * logo12 = " S " ;
const char * logo13 = " S " ;
const char * logo14 = " S " ;
const char * logo15 = " S " ;
const char * logo16 = " S " ;
{
2019-07-30 17:32:08 +00:00
ParagraphBuilderImpl builder ( paraStyle , getFontCollection ( ) ) ;
2019-05-30 20:12:56 +00:00
builder . pushStyle ( style0 ) ;
2019-09-27 19:16:13 +00:00
builder . addText ( logo11 , strlen ( logo1 ) ) ;
2019-05-30 20:12:56 +00:00
builder . pop ( ) ;
builder . pushStyle ( style1 ) ;
2019-09-27 19:16:13 +00:00
builder . addText ( logo12 , strlen ( logo2 ) ) ;
2019-05-30 20:12:56 +00:00
builder . pop ( ) ;
2019-09-27 19:16:13 +00:00
builder . addText ( " " , 3 ) ;
2019-05-30 20:12:56 +00:00
builder . pushStyle ( style0 ) ;
2019-09-27 19:16:13 +00:00
builder . addText ( logo13 , strlen ( logo3 ) ) ;
2019-05-30 20:12:56 +00:00
builder . pop ( ) ;
builder . pushStyle ( style1 ) ;
2019-09-27 19:16:13 +00:00
builder . addText ( logo14 , strlen ( logo4 ) ) ;
2019-05-30 20:12:56 +00:00
builder . pop ( ) ;
2019-09-27 19:16:13 +00:00
builder . addText ( " " , 3 ) ;
2019-05-30 20:12:56 +00:00
builder . pushStyle ( style0 ) ;
2019-09-27 19:16:13 +00:00
builder . addText ( logo15 , strlen ( logo5 ) ) ;
2019-05-30 20:12:56 +00:00
builder . pop ( ) ;
builder . pushStyle ( style1 ) ;
2019-09-27 19:16:13 +00:00
builder . addText ( logo16 , strlen ( logo6 ) ) ;
2019-05-30 20:12:56 +00:00
builder . pop ( ) ;
auto paragraph = builder . Build ( ) ;
paragraph - > layout ( w ) ;
paragraph - > paint ( canvas , 40 , h ) ;
canvas - > translate ( 0 , h ) ;
}
}
void onDrawContent ( SkCanvas * canvas ) override {
canvas - > drawColor ( SK_ColorWHITE ) ;
SkScalar width = this - > width ( ) ;
SkScalar height = this - > height ( ) / 4 ;
hangingS ( canvas , width , height ) ;
}
private :
typedef Sample INHERITED ;
} ;
2019-07-23 14:11:03 +00:00
class ParagraphView7 : public ParagraphView_Base {
2019-05-30 20:12:56 +00:00
protected :
2019-07-03 14:55:44 +00:00
SkString name ( ) override { return SkString ( " Paragraph7 " ) ; }
2019-05-30 20:12:56 +00:00
void drawText ( SkCanvas * canvas , SkColor background , SkScalar letterSpace , SkScalar w ,
SkScalar h ) {
SkAutoCanvasRestore acr ( canvas , true ) ;
canvas - > clipRect ( SkRect : : MakeWH ( w , h ) ) ;
canvas - > drawColor ( background ) ;
const char * line =
2019-08-01 20:02:17 +00:00
" World domination is such an ugly phrase - I prefer to call it world optimisation. " ;
2019-05-30 20:12:56 +00:00
ParagraphStyle paragraphStyle ;
paragraphStyle . setTextAlign ( TextAlign : : kLeft ) ;
paragraphStyle . setMaxLines ( 10 ) ;
paragraphStyle . turnHintingOff ( ) ;
TextStyle textStyle ;
textStyle . setFontFamilies ( { SkString ( " Roboto " ) } ) ;
textStyle . setFontSize ( 30 ) ;
textStyle . setLetterSpacing ( letterSpace ) ;
textStyle . setColor ( SK_ColorBLACK ) ;
textStyle . setFontStyle ( SkFontStyle ( SkFontStyle : : kMedium_Weight , SkFontStyle : : kNormal_Width ,
SkFontStyle : : kUpright_Slant ) ) ;
2019-07-30 17:32:08 +00:00
ParagraphBuilderImpl builder ( paragraphStyle , getFontCollection ( ) ) ;
2019-05-30 20:12:56 +00:00
builder . pushStyle ( textStyle ) ;
2019-09-27 19:16:13 +00:00
builder . addText ( line , strlen ( line ) ) ;
2019-05-30 20:12:56 +00:00
builder . pop ( ) ;
auto paragraph = builder . Build ( ) ;
paragraph - > layout ( w - 20 ) ;
paragraph - > paint ( canvas , 10 , 10 ) ;
}
void onDrawContent ( SkCanvas * canvas ) override {
canvas - > drawColor ( SK_ColorWHITE ) ;
auto h = this - > height ( ) / 4 ;
auto w = this - > width ( ) / 2 ;
drawText ( canvas , SK_ColorGRAY , 1 , w , h ) ;
canvas - > translate ( 0 , h ) ;
drawText ( canvas , SK_ColorLTGRAY , 2 , w , h ) ;
canvas - > translate ( 0 , h ) ;
drawText ( canvas , SK_ColorCYAN , 3 , w , h ) ;
canvas - > translate ( 0 , h ) ;
drawText ( canvas , SK_ColorGRAY , 4 , w , h ) ;
canvas - > translate ( w , - 3 * h ) ;
drawText ( canvas , SK_ColorYELLOW , 5 , w , h ) ;
canvas - > translate ( 0 , h ) ;
drawText ( canvas , SK_ColorGREEN , 10 , w , h ) ;
canvas - > translate ( 0 , h ) ;
drawText ( canvas , SK_ColorRED , 15 , w , h ) ;
canvas - > translate ( 0 , h ) ;
drawText ( canvas , SK_ColorBLUE , 20 , w , h ) ;
canvas - > translate ( 0 , h ) ;
}
private :
typedef Sample INHERITED ;
} ;
2019-07-23 14:11:03 +00:00
class ParagraphView8 : public ParagraphView_Base {
2019-05-30 20:12:56 +00:00
protected :
2019-08-01 20:02:17 +00:00
SkString name ( ) override { return SkString ( " Paragraph8 " ) ; }
2019-05-30 20:12:56 +00:00
void drawText ( SkCanvas * canvas , SkColor background , SkScalar wordSpace , SkScalar w ,
SkScalar h ) {
SkAutoCanvasRestore acr ( canvas , true ) ;
canvas - > clipRect ( SkRect : : MakeWH ( w , h ) ) ;
canvas - > drawColor ( background ) ;
const char * line =
2019-08-01 20:02:17 +00:00
" World domination is such an ugly phrase - I prefer to call it world optimisation. " ;
2019-05-30 20:12:56 +00:00
ParagraphStyle paragraphStyle ;
paragraphStyle . setTextAlign ( TextAlign : : kLeft ) ;
paragraphStyle . setMaxLines ( 10 ) ;
paragraphStyle . turnHintingOff ( ) ;
TextStyle textStyle ;
textStyle . setFontFamilies ( { SkString ( " Roboto " ) } ) ;
textStyle . setFontSize ( 30 ) ;
textStyle . setWordSpacing ( wordSpace ) ;
textStyle . setColor ( SK_ColorBLACK ) ;
textStyle . setFontStyle ( SkFontStyle ( SkFontStyle : : kMedium_Weight , SkFontStyle : : kNormal_Width ,
SkFontStyle : : kUpright_Slant ) ) ;
2019-07-30 17:32:08 +00:00
ParagraphBuilderImpl builder ( paragraphStyle , getFontCollection ( ) ) ;
2019-05-30 20:12:56 +00:00
builder . pushStyle ( textStyle ) ;
2019-09-27 19:16:13 +00:00
builder . addText ( line , strlen ( line ) ) ;
2019-05-30 20:12:56 +00:00
builder . pop ( ) ;
auto paragraph = builder . Build ( ) ;
paragraph - > layout ( w - 20 ) ;
paragraph - > paint ( canvas , 10 , 10 ) ;
}
void onDrawContent ( SkCanvas * canvas ) override {
canvas - > drawColor ( SK_ColorWHITE ) ;
auto h = this - > height ( ) / 4 ;
auto w = this - > width ( ) / 2 ;
drawText ( canvas , SK_ColorGRAY , 1 , w , h ) ;
canvas - > translate ( 0 , h ) ;
drawText ( canvas , SK_ColorLTGRAY , 2 , w , h ) ;
canvas - > translate ( 0 , h ) ;
drawText ( canvas , SK_ColorCYAN , 3 , w , h ) ;
canvas - > translate ( 0 , h ) ;
drawText ( canvas , SK_ColorGRAY , 4 , w , h ) ;
canvas - > translate ( w , - 3 * h ) ;
drawText ( canvas , SK_ColorYELLOW , 5 , w , h ) ;
canvas - > translate ( 0 , h ) ;
drawText ( canvas , SK_ColorGREEN , 10 , w , h ) ;
canvas - > translate ( 0 , h ) ;
drawText ( canvas , SK_ColorRED , 15 , w , h ) ;
canvas - > translate ( 0 , h ) ;
drawText ( canvas , SK_ColorBLUE , 20 , w , h ) ;
canvas - > translate ( 0 , h ) ;
}
private :
typedef Sample INHERITED ;
} ;
2019-07-23 14:11:03 +00:00
class ParagraphView9 : public ParagraphView_Base {
2019-05-30 20:12:56 +00:00
protected :
2019-07-03 14:55:44 +00:00
SkString name ( ) override { return SkString ( " Paragraph9 " ) ; }
2019-05-30 20:12:56 +00:00
2019-07-03 19:53:04 +00:00
bool onChar ( SkUnichar uni ) override {
2019-05-30 20:12:56 +00:00
switch ( uni ) {
case ' w ' :
+ + wordSpacing ;
return true ;
case ' q ' :
if ( wordSpacing > 0 ) - - wordSpacing ;
return true ;
case ' l ' :
+ + letterSpacing ;
return true ;
case ' k ' :
if ( letterSpacing > 0 ) - - letterSpacing ;
return true ;
default :
break ;
}
2019-07-03 19:53:04 +00:00
return false ;
2019-05-30 20:12:56 +00:00
}
void drawText ( SkCanvas * canvas , SkColor background , SkScalar w , SkScalar h ) {
SkAutoCanvasRestore acr ( canvas , true ) ;
canvas - > clipRect ( SkRect : : MakeWH ( w , h ) ) ;
canvas - > drawColor ( background ) ;
2019-10-09 13:43:02 +00:00
auto fontCollection = sk_make_sp < FontCollection > ( ) ;
fontCollection - > setDefaultFontManager ( SkFontMgr : : RefDefault ( ) ) ;
fontCollection - > enableFontFallback ( ) ;
2019-05-30 20:12:56 +00:00
const char * text =
" ( ´・‿・`)( ´・‿・`)( ´・‿・`)( ´・‿・`)( ´・‿・`)( ´・‿・`)( ´・‿・`)( "
" ´・‿・`)( ´・‿・`)( ´・‿・`)( ´・‿・`)( ´・‿・`)( ´・‿・`)( ´・‿・`)( "
" ´・‿・`)( ´・‿・`)( ´・‿・`)( ´・‿・`)( ´・‿・`)( ´・‿・`) " ;
2019-10-09 13:43:02 +00:00
auto multiplier = 5.67 ;
2019-05-30 20:12:56 +00:00
ParagraphStyle paragraphStyle ;
paragraphStyle . setTextAlign ( TextAlign : : kLeft ) ;
paragraphStyle . setMaxLines ( 10 ) ;
paragraphStyle . turnHintingOff ( ) ;
TextStyle textStyle ;
textStyle . setFontFamilies ( { SkString ( " Roboto " ) } ) ;
2019-10-09 13:43:02 +00:00
textStyle . setFontSize ( 5 * multiplier ) ;
2019-05-30 20:12:56 +00:00
textStyle . setHeight ( 1.3f ) ;
textStyle . setColor ( SK_ColorBLACK ) ;
textStyle . setFontStyle ( SkFontStyle ( SkFontStyle : : kMedium_Weight , SkFontStyle : : kNormal_Width ,
SkFontStyle : : kUpright_Slant ) ) ;
2019-10-09 13:43:02 +00:00
ParagraphBuilderImpl builder ( paragraphStyle , fontCollection ) ;
2019-05-30 20:12:56 +00:00
builder . pushStyle ( textStyle ) ;
2019-09-27 19:16:13 +00:00
builder . addText ( text , strlen ( text ) ) ;
2019-05-30 20:12:56 +00:00
builder . pop ( ) ;
auto paragraph = builder . Build ( ) ;
2019-10-09 13:43:02 +00:00
paragraph - > layout ( 200 * multiplier ) ;
2019-05-30 20:12:56 +00:00
std : : vector < size_t > sizes = { 0 , 1 , 2 , 8 , 19 , 21 , 22 , 30 , 150 } ;
std : : vector < size_t > colors = { SK_ColorBLUE , SK_ColorCYAN , SK_ColorLTGRAY , SK_ColorGREEN ,
SK_ColorRED , SK_ColorWHITE , SK_ColorYELLOW , SK_ColorMAGENTA } ;
RectHeightStyle rect_height_style = RectHeightStyle : : kTight ;
RectWidthStyle rect_width_style = RectWidthStyle : : kTight ;
for ( size_t i = 0 ; i < sizes . size ( ) - 1 ; + + i ) {
2019-10-09 13:43:02 +00:00
size_t from = sizes [ i ] ;
2019-05-30 20:12:56 +00:00
size_t to = sizes [ i + 1 ] ;
auto boxes = paragraph - > getRectsForRange ( from , to , rect_height_style , rect_width_style ) ;
if ( boxes . empty ( ) ) {
continue ;
}
for ( auto & box : boxes ) {
SkPaint paint ;
paint . setColor ( colors [ i % colors . size ( ) ] ) ;
paint . setShader ( setgrad ( box . rect , colors [ i % colors . size ( ) ] , SK_ColorWHITE ) ) ;
canvas - > drawRect ( box . rect , paint ) ;
}
}
paragraph - > paint ( canvas , 0 , 0 ) ;
}
void onDrawContent ( SkCanvas * canvas ) override {
canvas - > drawColor ( SK_ColorWHITE ) ;
auto h = this - > height ( ) ;
auto w = this - > width ( ) ;
drawText ( canvas , SK_ColorGRAY , w , h ) ;
}
private :
typedef Sample INHERITED ;
SkScalar letterSpacing ;
SkScalar wordSpacing ;
} ;
2019-07-23 14:11:03 +00:00
class ParagraphView10 : public ParagraphView_Base {
2019-05-30 20:12:56 +00:00
protected :
2019-07-03 14:55:44 +00:00
SkString name ( ) override { return SkString ( " Paragraph10 " ) ; }
2019-05-30 20:12:56 +00:00
void onDrawContent ( SkCanvas * canvas ) override {
canvas - > drawColor ( SK_ColorWHITE ) ;
2019-10-09 13:43:02 +00:00
auto multiplier = 5.67 ;
2019-05-30 20:12:56 +00:00
const char * text = " English English 字典 字典 😀😃😄 😀😃😄 " ;
2019-10-09 13:43:02 +00:00
auto fontCollection = sk_make_sp < FontCollection > ( ) ;
fontCollection - > setDefaultFontManager ( SkFontMgr : : RefDefault ( ) ) ;
fontCollection - > enableFontFallback ( ) ;
2019-05-30 20:12:56 +00:00
ParagraphStyle paragraph_style ;
paragraph_style . turnHintingOff ( ) ;
2019-10-09 13:43:02 +00:00
ParagraphBuilderImpl builder ( paragraph_style , fontCollection ) ;
2019-05-30 20:12:56 +00:00
TextStyle text_style ;
2019-06-21 16:22:32 +00:00
text_style . setFontFamilies ( { SkString ( " Roboto " ) ,
SkString ( " Noto Color Emoji " ) ,
2019-10-09 13:43:02 +00:00
SkString ( " Noto Serif CJK JP " ) } ) ;
text_style . setFontSize ( 10 * multiplier ) ;
2019-05-30 20:12:56 +00:00
text_style . setLetterSpacing ( 0 ) ;
text_style . setWordSpacing ( 0 ) ;
text_style . setColor ( SK_ColorBLACK ) ;
text_style . setHeight ( 1 ) ;
builder . pushStyle ( text_style ) ;
2019-09-27 19:16:13 +00:00
builder . addText ( text , strlen ( text ) ) ;
2019-05-30 20:12:56 +00:00
builder . pop ( ) ;
auto paragraph = builder . Build ( ) ;
paragraph - > layout ( width ( ) ) ;
paragraph - > paint ( canvas , 0 , 0 ) ;
}
private :
typedef Sample INHERITED ;
} ;
2019-07-23 14:11:03 +00:00
class ParagraphView11 : public ParagraphView_Base {
2019-05-30 20:12:56 +00:00
protected :
2019-07-03 14:55:44 +00:00
SkString name ( ) override { return SkString ( " Paragraph11 " ) ; }
2019-05-30 20:12:56 +00:00
void onDrawContent ( SkCanvas * canvas ) override {
canvas - > drawColor ( SK_ColorWHITE ) ;
2019-06-21 16:22:32 +00:00
2019-09-05 18:35:17 +00:00
auto text = " \U0001f469 \U0000200D \U0001f469 \U0000200D \U0001f466 \U0001f469 \U0000200D \U0001f469 \U0000200D \U0001f467 \U0000200D \U0001f467 \U0001f1fa \U0001f1f8 " ;
2019-10-09 13:43:02 +00:00
TextStyle text_style ;
text_style . setFontFamilies ( { SkString ( " Ahem " ) } ) ;
text_style . setColor ( SK_ColorBLACK ) ;
text_style . setFontSize ( 60 ) ;
text_style . setLetterSpacing ( 0 ) ;
text_style . setWordSpacing ( 0 ) ;
ParagraphStyle paragraph_style ;
paragraph_style . setTextStyle ( text_style ) ;
auto fontCollection = sk_make_sp < TestFontCollection > ( GetResourcePath ( " fonts " ) . c_str ( ) , true , true ) ;
ParagraphBuilderImpl builder ( paragraph_style , fontCollection ) ;
builder . addText ( text , strlen ( text ) ) ;
auto paragraph = builder . Build ( ) ;
paragraph - > layout ( 1000 ) ;
paragraph - > paint ( canvas , 0 , 0 ) ;
struct pair {
unsigned fX ;
unsigned fY ;
} ;
pair hit1 [ ] =
{ { 0 , 8 } , { 1 , 33 } , { 2 , 34 } , { 3 , 19 } , { 4 , 20 } ,
{ 5 , 21 } , { 6 , 22 } , { 7 , 23 } , { 8 , 24 } , { 9 , 25 } ,
{ 10 , 26 } , { 11 , 27 } , { 12 , 28 } , { 13 , 21 } , { 14 , 22 } ,
{ 15 , 23 } , { 16 , 24 } , { 17 , 21 } , { 18 , 22 } , { 19 , 21 } ,
{ 20 , 24 } , { 21 , 23 } , } ;
pair miss [ ] =
{ { 0 , 4 } , { 1 , 17 } , { 2 , 18 } , { 3 , 11 } , { 4 , 12 } ,
{ 5 , 13 } , { 6 , 14 } , { 7 , 15 } , { 8 , 16 } , { 9 , 17 } ,
{ 10 , 18 } , { 11 , 19 } , { 12 , 20 } , { 13 , 17 } , { 14 , 18 } ,
{ 15 , 19 } , { 16 , 20 } , { 17 , 19 } , { 18 , 20 } ,
{ 20 , 22 } , } ;
auto rects = paragraph - > getRectsForRange ( 7 , 9 , RectHeightStyle : : kTight , RectWidthStyle : : kTight ) ;
SkPaint paint ;
paint . setColor ( SK_ColorRED ) ;
paint . setStyle ( SkPaint : : kStroke_Style ) ;
paint . setAntiAlias ( true ) ;
paint . setStrokeWidth ( 1 ) ;
if ( ! rects . empty ( ) ) {
canvas - > drawRect ( rects [ 0 ] . rect , paint ) ;
}
for ( auto & query : hit1 ) {
auto rects = paragraph - > getRectsForRange ( query . fX , query . fY , RectHeightStyle : : kTight , RectWidthStyle : : kTight ) ;
if ( rects . size ( ) > = 1 & & rects [ 0 ] . rect . width ( ) > 0 ) {
} else {
SkDebugf ( " +[%d:%d): Bad \n " , query . fX , query . fY ) ;
2019-09-05 18:35:17 +00:00
}
2019-10-09 13:43:02 +00:00
}
for ( auto & query : miss ) {
auto miss = paragraph - > getRectsForRange ( query . fX , query . fY , RectHeightStyle : : kTight , RectWidthStyle : : kTight ) ;
if ( miss . empty ( ) ) {
} else {
SkDebugf ( " -[%d:%d): Bad \n " , query . fX , query . fY ) ;
}
}
2019-09-05 18:35:17 +00:00
}
private :
typedef Sample INHERITED ;
} ;
class ParagraphView12 : public ParagraphView_Base {
protected :
SkString name ( ) override { return SkString ( " Paragraph12 " ) ; }
void onDrawContent ( SkCanvas * canvas ) override {
canvas - > drawColor ( SK_ColorWHITE ) ;
const char * text = " Atwater Peel Sherbrooke Bonaventure Angrignon Peel Côte-des-Neiges " ;
TextStyle text_style ;
text_style . setFontFamilies ( { SkString ( " Ahem " ) } ) ;
text_style . setColor ( SK_ColorBLACK ) ;
text_style . setFontSize ( 16 ) ;
//text_style.setLetterSpacing(-0.41);
StrutStyle strut_style ;
strut_style . setStrutEnabled ( false ) ;
ParagraphStyle paragraph_style ;
paragraph_style . setStrutStyle ( strut_style ) ;
paragraph_style . setTextStyle ( text_style ) ;
ParagraphBuilderImpl builder ( paragraph_style , getFontCollection ( ) ) ;
builder . addText ( text ) ;
auto paragraph = builder . Build ( ) ;
paragraph - > layout ( 1095.000000 ) ;
auto result = paragraph - > getRectsForRange ( 65 , 66 , RectHeightStyle : : kTight , RectWidthStyle : : kTight ) ;
paragraph - > paint ( canvas , 0 , 0 ) ;
SkPaint paint ;
paint . setColor ( SK_ColorRED ) ;
paint . setStyle ( SkPaint : : kStroke_Style ) ;
paint . setAntiAlias ( true ) ;
paint . setStrokeWidth ( 1 ) ;
canvas - > drawRect ( result . front ( ) . rect , paint ) ;
}
private :
typedef Sample INHERITED ;
} ;
class ParagraphView14 : public ParagraphView_Base {
protected :
SkString name ( ) override { return SkString ( " Paragraph14 " ) ; }
void onDrawContent ( SkCanvas * canvas ) override {
canvas - > drawColor ( SK_ColorWHITE ) ;
TextStyle text_style ;
text_style . setFontFamilies ( { SkString ( " Ahem " ) } ) ;
text_style . setColor ( SK_ColorBLACK ) ;
text_style . setFontSize ( 25 ) ;
text_style . setDecoration ( ( TextDecoration ) ( TextDecoration : : kUnderline | TextDecoration : : kOverline | TextDecoration : : kLineThrough ) ) ;
text_style . setDecorationColor ( SK_ColorBLUE ) ;
text_style . setDecorationStyle ( TextDecorationStyle : : kWavy ) ;
text_style . setDecorationThicknessMultiplier ( 4.0f ) ;
ParagraphStyle paragraph_style ;
paragraph_style . setTextStyle ( text_style ) ;
paragraph_style . setTextDirection ( TextDirection : : kRtl ) ;
ParagraphBuilderImpl builder ( paragraph_style , getFontCollection ( ) ) ;
builder . pushStyle ( text_style ) ;
builder . addText ( " Hello, wor! \n abcd. " ) ;
auto paragraph = builder . Build ( ) ;
paragraph - > layout ( 300 ) ;
paragraph - > paint ( canvas , 0 , 0 ) ;
SkPaint paint ;
paint . setColor ( SK_ColorRED ) ;
paint . setStyle ( SkPaint : : kStroke_Style ) ;
paint . setAntiAlias ( true ) ;
paint . setStrokeWidth ( 1 ) ;
canvas - > drawRect ( SkRect : : MakeXYWH ( 0 , 0 , 300 , 100 ) , paint ) ;
}
private :
typedef Sample INHERITED ;
} ;
class ParagraphView15 : public ParagraphView_Base {
protected :
SkString name ( ) override { return SkString ( " Paragraph15 " ) ; }
void onDrawContent ( SkCanvas * canvas ) override {
canvas - > drawColor ( SK_ColorWHITE ) ;
2019-10-09 13:43:02 +00:00
2019-09-05 18:35:17 +00:00
TextStyle text_style ;
2019-10-09 13:43:02 +00:00
text_style . setFontFamilies ( { SkString ( " abc.ttf " ) } ) ;
text_style . setFontSize ( 50 ) ;
auto fontCollection = sk_make_sp < TestFontCollection > ( GetResourcePath ( " fonts " ) . c_str ( ) , false ) ;
fontCollection - > addFontFromFile ( " abc/abc.ttf " , " abc " ) ;
fontCollection - > addFontFromFile ( " abc/abc+grave.ttf " , " abc+grave " ) ;
fontCollection - > addFontFromFile ( " abc/abc+agrave.ttf " , " abc+agrave " ) ;
2019-09-05 18:35:17 +00:00
ParagraphStyle paragraph_style ;
2019-10-09 13:43:02 +00:00
ParagraphBuilderImpl builder ( paragraph_style , fontCollection ) ;
text_style . setFontFamilies ( { SkString ( " abc " ) , SkString ( " abc+grave " ) } ) ;
text_style . setColor ( SK_ColorBLUE ) ;
2019-09-05 18:35:17 +00:00
builder . pushStyle ( text_style ) ;
2019-10-09 13:43:02 +00:00
builder . addText ( u " a \u0300 " ) ;
text_style . setColor ( SK_ColorMAGENTA ) ;
2019-09-05 18:35:17 +00:00
builder . pushStyle ( text_style ) ;
2019-10-09 13:43:02 +00:00
builder . addText ( u " à " ) ;
text_style . setFontFamilies ( { SkString ( " abc " ) , SkString ( " abc+agrave " ) } ) ;
text_style . setColor ( SK_ColorRED ) ;
builder . pushStyle ( text_style ) ;
builder . addText ( u " a \u0300 " ) ;
text_style . setColor ( SK_ColorGREEN ) ;
2019-09-05 18:35:17 +00:00
builder . pushStyle ( text_style ) ;
2019-10-09 13:43:02 +00:00
builder . addText ( u " à " ) ;
2019-09-05 18:35:17 +00:00
auto paragraph = builder . Build ( ) ;
2019-10-09 13:43:02 +00:00
paragraph - > layout ( 800 ) ;
paragraph - > paint ( canvas , 50 , 50 ) ;
}
private :
typedef Sample INHERITED ;
} ;
class ParagraphView16 : public ParagraphView_Base {
protected :
SkString name ( ) override { return SkString ( " Paragraph16 " ) ; }
void onDrawContent ( SkCanvas * canvas ) override {
canvas - > drawColor ( SK_ColorWHITE ) ;
const char * text = " content " ;
ParagraphStyle paragraph_style ;
paragraph_style . setMaxLines ( 1 ) ;
paragraph_style . setEllipsis ( u " \u2026 " ) ;
//auto fontCollection = sk_make_sp<TestFontCollection>(GetResourcePath("fonts").c_str(), false, true);
auto fontCollection = sk_make_sp < FontCollection > ( ) ;
fontCollection - > setDefaultFontManager ( SkFontMgr : : RefDefault ( ) ) ;
fontCollection - > enableFontFallback ( ) ;
ParagraphBuilderImpl builder ( paragraph_style , fontCollection ) ;
TextStyle text_style ;
text_style . setFontFamilies ( { SkString ( " .SF Pro Text " ) } ) ;
text_style . setColor ( SK_ColorBLACK ) ;
text_style . setFontSize ( 17.0f * 99.0f ) ;
text_style . setLetterSpacing ( 0.41f ) ;
builder . pushStyle ( text_style ) ;
builder . addText ( text ) ;
auto paragraph = builder . Build ( ) ;
paragraph - > layout ( 800 ) ;
2019-09-05 18:35:17 +00:00
paragraph - > paint ( canvas , 0 , 0 ) ;
2019-10-09 13:43:02 +00:00
}
private :
typedef Sample INHERITED ;
} ;
class ParagraphView17 : public ParagraphView_Base {
protected :
SkString name ( ) override { return SkString ( " Paragraph17 " ) ; }
void onDrawContent ( SkCanvas * canvas ) override {
canvas - > drawColor ( SK_ColorWHITE ) ;
auto fontCollection = sk_make_sp < FontCollection > ( ) ;
fontCollection - > setDefaultFontManager ( SkFontMgr : : RefDefault ( ) ) ;
fontCollection - > enableFontFallback ( ) ;
auto navy = SkColorSetRGB ( 0 , 0 , 139 ) ;
auto ltgray = SkColorSetRGB ( 211 , 211 , 211 ) ;
auto multiplier = 5.67 ;
const char * text = " >Sͬ͑̀͐̈͒̈́̋̎ͮͩ̽̓ͬ̂̆̔͗́̓ͣͧ͊ͫ͛̉͌̐̑ͪ͗̚͝҉̴͉͢k̡̊̓ͫͭͩ͂͊ͨͪͬ̑ͫ̍̌̄͛̌̂̑̂̋̊̔ͫ͛̽̑ͨ̍ͭ̓̀ͪͪ̉͐͗̌̓̃̚͟͝҉̢͏ ̫̞̙͇͖̮͕̗̟͕͇͚̻͈̣̻̪͉̰̲̣̫ͅͅP̴̅̍͒̿͗͗̇ͩ̃͆͌̀̽͏ ̧̡͕͖̝̖̼̺̰̣̬͔͖͔̼͙̞̦̫͓̘͜a̸̴̸̴̢̢̨̨̫͍͓̥̼̭̼̻̤̯̙̤̻̠͚̍̌͋̂ͦͨ̽̇͌͌͆̀̽̎͒̄ͪ̐ͦ̈ͫ͐͗̓̚̚͜ͅr͐͐ͤͫ̐ͥ͂̈́̿́ͮ̃͗̓̏ͫ̀̿͏ ̸̵̧́͘̕͟͝͠͞͠҉̷̧͚͢͟a̓̽̎̄͗̔͛̄̐͊͛ͫ͂͌̂̂̈̈̓̔̅̅̄͊̉́ͪ̑̄͆ͬ̍͆ͭ͋̐ͬ͏ ̷̵̨̢̩̹̖͓̥̳̰͔̱̬͖̙͓̙͇̀̀̕͜͟͟͢͟͜͠͡g̨̅̇ͦ͋̂ͦͨͭ̓͐͆̏̂͛̉ͧ̑ͫ̐̒͛ͫ̍̒͛́̚҉̷̨̛̛̀͜͢͞҉̩̘̲͍͎̯̹̝̭̗̱͇͉̲̱͔̯̠̹̥̻͉̲̜̤̰̪̗̺̖̺r̷͌̓̇̅ͭ̀̐̃̃ͭ͑͗̉̈̇̈́ͥ̓ͣ́ͤ͂ͤ͂̏͌̆̚҉̴̸̧̢̢̛̫͉̦̥̤̙͈͉͈͉͓̙̗̟̳̜͈̗̺̟̠̠͖͓̖̪͕̠̕̕͝ͅả̸̴̡̡̧͠͞͡͞҉̛̕͟͏ ̷̘̪̱͈̲͉̞̠̞̪̫͎̲̬̖̀̀͟͝͞͞͠p̛͂̈͐̚͠҉̵̸̡̢̢̩̹͙̯͖̙̙̮̥̙͚̠͔̥̭̮̞̣̪̬̥̠̖̝̥̪͎́̀̕͜͡͡ͅͅh̵̷̵̡̛ͤ̂͌̐̓̐̋̋͊̒̆̽́̀̀̀͢͠͞͞҉̷̸̢̕҉͚̯͖̫̜̞̟̠̱͉̝̲̹̼͉̟͉̩̮͔̤͖̞̭̙̹̬ͅ< " ;
ParagraphStyle paragraph_style ;
ParagraphBuilderImpl builder ( paragraph_style , fontCollection ) ;
2019-09-05 18:35:17 +00:00
SkPaint paint ;
2019-10-09 13:43:02 +00:00
paint . setColor ( ltgray ) ;
TextStyle text_style ;
text_style . setBackgroundColor ( paint ) ;
text_style . setColor ( navy ) ;
text_style . setFontFamilies ( { SkString ( " Roboto " ) } ) ;
text_style . setFontSize ( 20 * multiplier ) ;
builder . pushStyle ( text_style ) ;
builder . addText ( text ) ;
auto paragraph = builder . Build ( ) ;
paragraph - > layout ( 10000 ) ;
paragraph - > paint ( canvas , 0 , 0 ) ;
}
private :
typedef Sample INHERITED ;
} ;
class Zalgo {
private :
std : : u16string COMBINING_DOWN = u " \u0316 \u0317 \u0318 \u0319 \u031c \u031d \u031e \u031f \u0320 \u0324 \u0325 \u0326 \u0329 \u032a \u032b \u032c \u032d \u032e \u032f \u0330 \u0331 \u0332 \u0333 \u0339 \u033a \u033b \u033c \u0345 \u0347 \u0348 \u0349 \u034d \u034e \u0353 \u0354 \u0355 \u0356 \u0359 \u035a \u0323 " ;
std : : u16string COMBINING_UP = u " \u030d \u030e \u0304 \u0305 \u033f \u0311 \u0306 \u0310 \u0352 \u0357 \u0351 \u0307 \u0308 \u030a \u0342 \u0343 \u0344 \u034a \u034b \u034c \u0303 \u0302 \u030c \u0350 \u0300 \u0301 \u030b \u030f \u0312 \u0313 \u0314 \u033d \u0309 \u0363 \u0364 \u0365 \u0366 \u0367 \u0368 \u0369 \u036a \u036b \u036c \u036d \u036e \u035b \u0346 \u031a " ;
std : : u16string COMBINING_MIDDLE = u " \u0315 \u031b \u0340 \u0341 \u0358 \u0321 \u0322 \u0327 \u0328 \u0334 \u0335 \u0336 \u034f \u035c \u035d \u035e \u035f \u0360 \u0362 \u0338 \u0337 \u0361 \u0489 " ;
std : : u16string randomMarks ( std : : u16string & combiningMarks ) {
std : : u16string result ;
auto num = std : : rand ( ) % ( combiningMarks . size ( ) / 1 ) ;
for ( size_t i = 0 ; i < num ; + + i ) {
auto index = std : : rand ( ) % combiningMarks . size ( ) ;
result + = combiningMarks [ index ] ;
}
return result ;
}
public :
std : : u16string zalgo ( std : : string victim ) {
std : : u16string result ;
for ( auto & c : victim ) {
result + = c ;
result + = randomMarks ( COMBINING_UP ) ;
result + = randomMarks ( COMBINING_MIDDLE ) ;
result + = randomMarks ( COMBINING_DOWN ) ;
}
return result ;
}
} ;
class ParagraphView18 : public ParagraphView_Base {
protected :
SkString name ( ) override { return SkString ( " Paragraph18 " ) ; }
bool onChar ( SkUnichar uni ) override {
switch ( uni ) {
case ' ' :
fLimit = 400 ;
return true ;
case ' s ' :
fLimit + = 10 ;
return true ;
case ' f ' :
if ( fLimit > 10 ) {
fLimit - = 10 ;
}
return true ;
default :
break ;
}
return false ;
}
2019-09-05 18:35:17 +00:00
2019-10-09 13:43:02 +00:00
bool onAnimate ( double nanos ) override {
if ( + + fIndex > fLimit ) {
fRedraw = true ;
fIndex = 0 ;
} else {
fRepeat = true ;
}
return true ;
}
void onDrawContent ( SkCanvas * canvas ) override {
canvas - > drawColor ( SK_ColorWHITE ) ;
auto navy = SkColorSetRGB ( 0 , 0 , 139 ) ;
auto ltgray = SkColorSetRGB ( 211 , 211 , 211 ) ;
auto multiplier = 5.67 ;
auto fontCollection = sk_make_sp < FontCollection > ( ) ;
fontCollection - > setDefaultFontManager ( SkFontMgr : : RefDefault ( ) ) ;
fontCollection - > enableFontFallback ( ) ;
ParagraphStyle paragraph_style ;
TextStyle text_style ;
text_style . setFontFamilies ( { SkString ( " Roboto " ) } ) ;
text_style . setFontSize ( 20 * multiplier ) ;
text_style . setColor ( navy ) ;
SkPaint paint ;
paint . setColor ( ltgray ) ;
text_style . setBackgroundColor ( paint ) ;
Zalgo zalgo ;
if ( fRedraw | | fRepeat ) {
if ( fRedraw | | fParagraph . get ( ) = = nullptr ) {
ParagraphBuilderImpl builder ( paragraph_style , fontCollection ) ;
builder . pushStyle ( text_style ) ;
auto utf16text = zalgo . zalgo ( " SkParagraph " ) ;
icu : : UnicodeString unicode ( ( UChar * ) utf16text . data ( ) , SkToS32 ( utf16text . size ( ) ) ) ;
std : : string str ;
unicode . toUTF8String ( str ) ;
SkDebugf ( " Text:>%s< \n " , str . data ( ) ) ;
builder . addText ( utf16text ) ;
fParagraph = builder . Build ( ) ;
}
auto impl = static_cast < ParagraphImpl * > ( fParagraph . get ( ) ) ;
impl - > setState ( InternalState : : kUnknown ) ;
fParagraph - > layout ( 1000 ) ;
fParagraph - > paint ( canvas , 300 , 200 ) ;
for ( auto & run : impl - > runs ( ) ) {
SkString fontFamily ( " unresolved " ) ;
if ( run . font ( ) . getTypeface ( ) ! = nullptr ) {
run . font ( ) . getTypeface ( ) - > getFamilyName ( & fontFamily ) ;
}
if ( run . font ( ) . getTypeface ( ) ! = nullptr ) {
for ( size_t i = 0 ; i < run . size ( ) ; + + i ) {
auto glyph = run . glyphs ( ) . begin ( ) + i ;
if ( * glyph = = 0 ) {
SkDebugf ( " Run[%d] @pos=%d \n " , run . index ( ) , i ) ;
SkASSERT ( false ) ;
}
}
} else {
SkDebugf ( " Run[%d]: %s \n " , run . index ( ) , fontFamily . c_str ( ) ) ;
SkASSERT ( false ) ;
}
}
fRedraw = false ;
fRepeat = false ;
2019-06-21 16:22:32 +00:00
}
}
private :
2019-10-09 13:43:02 +00:00
bool fRedraw = true ;
bool fRepeat = false ;
size_t fIndex = 0 ;
size_t fLimit = 20 ;
std : : unique_ptr < Paragraph > fParagraph ;
2019-06-21 16:22:32 +00:00
typedef Sample INHERITED ;
} ;
2019-10-09 13:43:02 +00:00
class ParagraphView19 : public ParagraphView_Base {
protected :
SkString name ( ) override { return SkString ( " Paragraph19 " ) ; }
void onDrawContent ( SkCanvas * canvas ) override {
canvas - > drawColor ( SK_ColorWHITE ) ;
auto fontCollection = sk_make_sp < TestFontCollection > ( GetResourcePath ( " fonts " ) . c_str ( ) , false , true ) ;
2019-12-04 16:43:32 +00:00
std : : u16string text = u " \u0068 \u0301 \u0350 \u0312 \u0357 \u030C \u0369 \u0305 \u036C \u0304 \u0310 \u033F \u0366 \u0350 \u0343 \u0364 \u0369 \u0311 \u0309 \u030E \u0365 \u031B \u0340 \u0337 \u0335 \u035E \u0334 \u0328 \u0360 \u0360 \u0315 \u035F \u0340 \u0340 \u0362 \u0360 \u0322 \u031B \u031B \u0337 \u0340 \u031E \u031F \u032A \u0331 \u0345 \u032F \u0332 \u032E \u0333 \u0353 \u0320 \u0345 \u031C \u031F \u033C \u0325 \u0355 \u032C \u0325 \u033A a \u0307 \u0312 \u034B \u0308 \u0312 \u0346 \u0313 \u0346 \u0304 \u0307 \u0344 \u0305 \u0342 \u0368 \u0346 \u036A \u035B \u030F \u0365 \u0307 \u0340 \u0328 \u0322 \u0361 \u0489 \u034F \u0328 \u0334 \u035F \u0335 \u0362 \u0489 \u0360 \u0358 \u035E \u0360 \u035D \u0341 \u0337 \u0337 \u032E \u0326 \u032D \u0359 \u0318 \u033C \u032F \u0333 \u035A \u034D \u0319 \u031C \u0353 \u033C \u0345 \u0359 \u0331 \u033B \u0331 \u033C " ;
2019-10-09 13:43:02 +00:00
ParagraphStyle paragraph_style ;
ParagraphBuilderImpl builder ( paragraph_style , fontCollection ) ;
TextStyle text_style ;
2019-11-25 15:00:43 +00:00
text_style . setColor ( SK_ColorBLACK ) ;
2019-10-09 13:43:02 +00:00
text_style . setFontFamilies ( { SkString ( " Roboto " ) } ) ;
2019-12-04 16:43:32 +00:00
text_style . setFontSize ( 20 ) ;
2019-10-09 13:43:02 +00:00
builder . pushStyle ( text_style ) ;
builder . addText ( text ) ;
auto paragraph = builder . Build ( ) ;
2019-11-25 15:00:43 +00:00
paragraph - > layout ( this - > width ( ) ) ;
paragraph - > paint ( canvas , 0 , 0 ) ;
}
private :
typedef Sample INHERITED ;
} ;
class ParagraphView20 : public ParagraphView_Base {
protected :
SkString name ( ) override { return SkString ( " Paragraph20 " ) ; }
void onDrawContent ( SkCanvas * canvas ) override {
canvas - > drawColor ( SK_ColorWHITE ) ;
2019-10-09 13:43:02 +00:00
2019-11-25 15:00:43 +00:00
auto fontCollection = sk_make_sp < TestFontCollection > ( GetResourcePath ( " fonts " ) . c_str ( ) , false , true ) ;
2019-10-09 13:43:02 +00:00
2020-01-08 21:53:53 +00:00
const char * text = " Manage your google account " ;
2019-11-25 15:00:43 +00:00
ParagraphStyle paragraph_style ;
2020-01-08 21:53:53 +00:00
paragraph_style . setEllipsis ( u " \u2026 " ) ;
paragraph_style . setMaxLines ( 1 ) ;
2019-11-25 15:00:43 +00:00
ParagraphBuilderImpl builder ( paragraph_style , fontCollection ) ;
TextStyle text_style ;
text_style . setColor ( SK_ColorBLACK ) ;
2019-12-18 14:39:55 +00:00
text_style . setFontFamilies ( { SkString ( " Roboto " ) } ) ;
2020-01-08 21:53:53 +00:00
text_style . setFontSize ( 50 ) ;
builder . pushStyle ( text_style ) ;
builder . addText ( text ) ;
auto paragraph = builder . Build ( ) ;
paragraph - > layout ( this - > width ( ) ) ;
paragraph - > paint ( canvas , 0 , 0 ) ;
}
private :
typedef Sample INHERITED ;
} ;
class ParagraphView21 : public ParagraphView_Base {
protected :
SkString name ( ) override { return SkString ( " Paragraph21 " ) ; }
void onDrawContent ( SkCanvas * canvas ) override {
canvas - > drawColor ( SK_ColorWHITE ) ;
2020-01-10 19:04:45 +00:00
const char * text = " Referral Code " ;
2020-01-08 21:53:53 +00:00
ParagraphStyle paragraph_style ;
2020-01-10 15:55:52 +00:00
ParagraphBuilderImpl builder ( paragraph_style , getFontCollection ( ) ) ;
2020-01-08 21:53:53 +00:00
TextStyle text_style ;
text_style . setColor ( SK_ColorBLACK ) ;
2020-01-10 15:55:52 +00:00
text_style . setFontFamilies ( { SkString ( " Google Sans " ) } ) ;
text_style . setFontSize ( 24 ) ;
2019-11-25 15:00:43 +00:00
builder . pushStyle ( text_style ) ;
builder . addText ( text ) ;
auto paragraph = builder . Build ( ) ;
2020-01-10 19:04:45 +00:00
paragraph - > layout ( 0 ) ;
2019-11-25 15:00:43 +00:00
paragraph - > paint ( canvas , 0 , 0 ) ;
2019-10-09 13:43:02 +00:00
}
2020-01-14 18:24:45 +00:00
private :
typedef Sample INHERITED ;
} ;
class ParagraphView22 : public ParagraphView_Base {
protected :
SkString name ( ) override { return SkString ( " Paragraph22 " ) ; }
2020-01-15 19:46:35 +00:00
bool onChar ( SkUnichar uni ) override {
switch ( uni ) {
case ' l ' :
direction = true ;
return true ;
case ' r ' :
direction = false ;
return true ;
default :
break ;
}
return false ;
}
2020-01-14 18:24:45 +00:00
void onDrawContent ( SkCanvas * canvas ) override {
2020-01-15 19:46:35 +00:00
canvas - > drawColor ( SK_ColorWHITE ) ;
ParagraphStyle paragraph_style ;
paragraph_style . setTextDirection ( direction ? TextDirection : : kLtr : TextDirection : : kRtl ) ;
auto collection = getFontCollection ( ) ;
ParagraphBuilderImpl builder ( paragraph_style , collection ) ;
collection - > getParagraphCache ( ) - > reset ( ) ;
collection - > getParagraphCache ( ) - > turnOn ( false ) ;
TextStyle text_style ;
text_style . setColor ( SK_ColorBLACK ) ;
text_style . setFontFamilies ( { SkString ( " Roboto " ) } ) ;
text_style . setFontSize ( 12 ) ;
builder . pushStyle ( text_style ) ;
builder . addText ( " I have got a " ) ;
text_style . setFontStyle ( SkFontStyle : : Bold ( ) ) ;
builder . pushStyle ( text_style ) ;
builder . addText ( " lovely bunch " ) ;
text_style . setFontStyle ( SkFontStyle : : Normal ( ) ) ;
builder . pushStyle ( text_style ) ;
builder . addText ( " of coconuts. " ) ;
auto paragraph = builder . Build ( ) ;
paragraph - > layout ( this - > width ( ) ) ;
paragraph - > paint ( canvas , 0 , 0 ) ;
collection - > getParagraphCache ( ) - > turnOn ( true ) ;
2020-01-14 18:24:45 +00:00
}
2019-10-09 13:43:02 +00:00
private :
typedef Sample INHERITED ;
2020-01-15 19:46:35 +00:00
bool direction ;
2019-10-09 13:43:02 +00:00
} ;
2020-01-15 19:46:35 +00:00
2020-01-21 18:55:44 +00:00
class ParagraphView23 : public ParagraphView_Base {
protected :
SkString name ( ) override { return SkString ( " Paragraph23 " ) ; }
void onDrawContent ( SkCanvas * canvas ) override {
canvas - > drawColor ( SK_ColorWHITE ) ;
const char * text = " Text with shadow " ;
ParagraphStyle paragraph_style ;
TextStyle text_style ;
text_style . setColor ( SK_ColorBLACK ) ;
text_style . setFontFamilies ( { SkString ( " Google Sans " ) } ) ;
text_style . setFontSize ( 24 ) ;
auto draw = [ & ] ( SkScalar h , SkScalar v , SkScalar b ) {
text_style . resetShadows ( ) ;
text_style . addShadow ( TextShadow ( SK_ColorBLACK , SkPoint : : Make ( h , v ) , b ) ) ;
ParagraphBuilderImpl builder ( paragraph_style , getFontCollection ( ) ) ;
builder . pushStyle ( text_style ) ;
builder . addText ( text ) ;
auto paragraph = builder . Build ( ) ;
paragraph - > layout ( 300 ) ;
paragraph - > paint ( canvas , 0 , 0 ) ;
auto rect = SkRect : : MakeXYWH ( 0 , 0 , paragraph - > getMaxWidth ( ) , paragraph - > getHeight ( ) ) ;
SkPaint paint ;
paint . setColor ( SK_ColorRED ) ;
paint . setStyle ( SkPaint : : kStroke_Style ) ;
paint . setAntiAlias ( true ) ;
paint . setStrokeWidth ( 1 ) ;
canvas - > drawRect ( rect , paint ) ;
} ;
draw ( 10 , 10 , 5 ) ;
canvas - > translate ( 0 , 100 ) ;
draw ( 10 , - 10 , 5 ) ;
canvas - > translate ( 0 , 100 ) ;
draw ( - 10 , - 10 , 5 ) ;
canvas - > translate ( 0 , 100 ) ;
draw ( - 10 , 10 , 5 ) ;
canvas - > translate ( 0 , 100 ) ;
}
private :
typedef Sample INHERITED ;
} ;
2020-01-22 15:56:53 +00:00
class ParagraphView24 : public ParagraphView_Base {
protected :
SkString name ( ) override { return SkString ( " Paragraph24 " ) ; }
void onDrawContent ( SkCanvas * canvas ) override {
canvas - > drawColor ( SK_ColorWHITE ) ;
ParagraphStyle paragraph_style ;
paragraph_style . setTextDirection ( TextDirection : : kRtl ) ;
TextStyle text_style ;
text_style . setColor ( SK_ColorBLACK ) ;
text_style . setFontFamilies ( { SkString ( " Google Sans " ) } ) ;
text_style . setFontSize ( 24 ) ;
{
ParagraphBuilderImpl builder ( paragraph_style , getFontCollection ( ) ) ;
builder . pushStyle ( text_style ) ;
builder . addText ( " Right_to_left: " ) ;
auto paragraph = builder . Build ( ) ;
paragraph - > layout ( this - > width ( ) ) ;
paragraph - > paint ( canvas , 0 , 0 ) ;
}
canvas - > translate ( 0 , 200 ) ;
{
ParagraphBuilderImpl builder ( paragraph_style , getFontCollection ( ) ) ;
builder . pushStyle ( text_style ) ;
builder . addText ( " Right_to_left+ " ) ;
auto paragraph = builder . Build ( ) ;
paragraph - > layout ( this - > width ( ) ) ;
paragraph - > paint ( canvas , 0 , 0 ) ;
}
canvas - > translate ( 0 , 200 ) ;
{
ParagraphBuilderImpl builder ( paragraph_style , getFontCollection ( ) ) ;
builder . pushStyle ( text_style ) ;
builder . addText ( " Right_to_left. " ) ;
auto paragraph = builder . Build ( ) ;
paragraph - > layout ( this - > width ( ) ) ;
paragraph - > paint ( canvas , 0 , 0 ) ;
}
}
private :
typedef Sample INHERITED ;
} ;
class ParagraphView25 : public ParagraphView_Base {
protected :
SkString name ( ) override { return SkString ( " Paragraph25 " ) ; }
void onDrawContent ( SkCanvas * canvas ) override {
canvas - > drawColor ( SK_ColorWHITE ) ;
2020-02-05 15:17:53 +00:00
/*
* Shell : ParagraphStyle : 1.000000 1
Shell : Strut enabled : 0 1.000000 14.000000 400 5 0
Shell : Font Families : 0
Shell : DefaultTextStyle : 16.000000 500 5 0
Shell : Font Families : 1 Roboto
Shell : Font Features : 0
Shell : TextStyle # 0 : [ 0 : 22 ) 16.000000 500 5 0
Shell : Font Families : 1 Roboto
Shell : Font Features : 0
Shell : TextStyle # 1 : [ 25 : 49 ) 16.000000 500 5 0
Shell : Font Families : 1 Roboto
Shell : Font Features : 0
Shell : Placeholder # 0 : [ 22 : 25 ) 32.000000 32.000000 32.000000 0 5
Shell : Placeholder # 1 : [ 49 : 52 ) 19.000000 41.000000 19.000000 0 4
Shell : Placeholder # 2 : [ 52 : 52 ) 0.000000 0.000000 0.000000 0 5
Shell : layout ( ' Go to device settings  and set up a passcode .  ' , 280.000000 ) : 280.000000 * 38.000000
*/
auto fontCollection = getFontCollection ( ) ;
//fontCollection->getParagraphCache()->turnOn(false);
const char * text1 = " Go to device settings " ;
const char * text2 = " and set up a passcode. " ;
2020-01-22 15:56:53 +00:00
ParagraphStyle paragraph_style ;
2020-02-05 15:17:53 +00:00
StrutStyle strut_style ;
strut_style . setStrutEnabled ( false ) ;
strut_style . setFontSize ( 14 ) ;
strut_style . setForceStrutHeight ( false ) ;
strut_style . setHeight ( 14 ) ;
paragraph_style . setStrutStyle ( strut_style ) ;
2020-01-22 15:56:53 +00:00
TextStyle text_style ;
text_style . setColor ( SK_ColorBLACK ) ;
2020-02-05 15:17:53 +00:00
text_style . setFontFamilies ( { SkString ( " Roboto " ) } ) ;
text_style . setFontSize ( 16 ) ;
PlaceholderStyle placeholder_style ;
{
ParagraphBuilderImpl builder ( paragraph_style , fontCollection ) ;
builder . pushStyle ( text_style ) ;
builder . addText ( text1 ) ;
placeholder_style . fHeight = 32 ;
placeholder_style . fWidth = 32 ;
placeholder_style . fBaselineOffset = 32 ;
placeholder_style . fBaseline = TextBaseline : : kAlphabetic ;
placeholder_style . fAlignment = PlaceholderAlignment : : kMiddle ;
builder . addPlaceholder ( placeholder_style ) ;
builder . addText ( text2 ) ;
placeholder_style . fHeight = 19 ;
placeholder_style . fWidth = 41 ;
placeholder_style . fBaselineOffset = 19 ;
placeholder_style . fBaseline = TextBaseline : : kAlphabetic ;
placeholder_style . fAlignment = PlaceholderAlignment : : kTop ;
builder . addPlaceholder ( placeholder_style ) ;
auto paragraph = builder . Build ( ) ;
paragraph - > layout ( 280 ) ;
paragraph - > paint ( canvas , 0 , 0 ) ;
}
2020-01-22 15:56:53 +00:00
}
private :
typedef Sample INHERITED ;
} ;
class ParagraphView26 : public ParagraphView_Base {
protected :
SkString name ( ) override { return SkString ( " Paragraph26 " ) ; }
void onDrawContent ( SkCanvas * canvas ) override {
2020-02-03 14:43:52 +00:00
auto fontCollection = sk_make_sp < FontCollection > ( ) ;
fontCollection - > setDefaultFontManager ( SkFontMgr : : RefDefault ( ) ) ;
2020-02-05 15:17:53 +00:00
//fontCollection->enableFontFallback();
2020-01-22 15:56:53 +00:00
2020-02-03 14:43:52 +00:00
canvas - > clear ( SK_ColorWHITE ) ;
SkPaint paint ;
paint . setAntiAlias ( true ) ;
paint . setColor ( SK_ColorBLACK ) ;
TextStyle textStyle ;
textStyle . setForegroundColor ( paint ) ;
2020-02-05 15:17:53 +00:00
textStyle . setFontFamilies ( { SkString ( " Roboto " ) } ) ;
textStyle . setFontSize ( 42.0f ) ;
textStyle . setLetterSpacing ( - 0.05f ) ;
textStyle . setHeightOverride ( true ) ;
2020-02-03 14:43:52 +00:00
ParagraphStyle paragraphStyle ;
paragraphStyle . setTextStyle ( textStyle ) ;
paragraphStyle . setTextAlign ( TextAlign : : kLeft ) ;
2020-02-05 15:17:53 +00:00
ParagraphBuilderImpl builder ( paragraphStyle , fontCollection ) ;
builder . addText ( u " Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam ut dolor ornare, fermentum nibh in, consectetur libero. Ut id semper est. Sed malesuada, est id bibendum egestas, urna risus tristique nibh, euismod interdum risus turpis nec purus. Maecenas dolor nisl, consectetur in vestibulum et, tincidunt id leo. Duis maximus, odio eget tristique commodo, lacus tellus dapibus leo, consequat pellentesque arcu nisi sit amet diam. Quisque euismod venenatis egestas. Mauris posuere volutpat iaculis. Suspendisse finibus tempor urna, dignissim venenatis sapien finibus eget. Donec interdum lacus ac venenatis fringilla. Curabitur eget lacinia augue. Vestibulum eu vulputate odio. Quisque nec imperdiet " ) ;
2020-02-03 14:43:52 +00:00
2020-02-05 15:17:53 +00:00
auto paragraph = builder . Build ( ) ;
paragraph - > layout ( this - > width ( ) / 2 ) ;
std : : vector < LineMetrics > lines ;
paragraph - > getLineMetrics ( lines ) ; // <-- error happens here
canvas - > translate ( 10 , 10 ) ;
paragraph - > paint ( canvas , 0 , 0 ) ;
2020-01-22 15:56:53 +00:00
}
private :
typedef Sample INHERITED ;
} ;
2020-01-23 15:16:26 +00:00
class ParagraphView27 : public ParagraphView_Base {
protected :
SkString name ( ) override { return SkString ( " Paragraph27 " ) ; }
void onDrawContent ( SkCanvas * canvas ) override {
2020-02-03 14:43:52 +00:00
auto fontCollection = sk_make_sp < FontCollection > ( ) ;
fontCollection - > setDefaultFontManager ( SkFontMgr : : RefDefault ( ) ) ;
fontCollection - > enableFontFallback ( ) ;
fontCollection - > getParagraphCache ( ) - > turnOn ( false ) ;
SkPaint red ;
red . setColor ( SK_ColorRED ) ;
red . setStyle ( SkPaint : : kStroke_Style ) ;
red . setAntiAlias ( true ) ;
red . setStrokeWidth ( 1 ) ;
SkPaint blue ;
blue . setColor ( SK_ColorRED ) ;
blue . setStyle ( SkPaint : : kStroke_Style ) ;
blue . setAntiAlias ( true ) ;
blue . setStrokeWidth ( 1 ) ;
SkPaint black ;
black . setColor ( SK_ColorBLACK ) ;
black . setStyle ( SkPaint : : kStroke_Style ) ;
black . setAntiAlias ( true ) ;
black . setStrokeWidth ( 1 ) ;
2020-01-23 15:16:26 +00:00
2020-02-05 15:17:53 +00:00
SkPaint whiteSpaces ;
whiteSpaces . setColor ( SK_ColorLTGRAY ) ;
SkPaint breakingSpace ;
breakingSpace . setColor ( SK_ColorYELLOW ) ;
SkPaint text ;
text . setColor ( SK_ColorWHITE ) ;
2020-01-23 15:16:26 +00:00
ParagraphStyle paragraph_style ;
2020-02-03 14:43:52 +00:00
paragraph_style . setTextAlign ( TextAlign : : kRight ) ;
2020-01-23 15:16:26 +00:00
TextStyle text_style ;
text_style . setColor ( SK_ColorBLACK ) ;
2020-02-03 14:43:52 +00:00
text_style . setFontFamilies ( { SkString ( " Roboto " ) } ) ;
2020-01-28 15:43:31 +00:00
2020-02-03 14:43:52 +00:00
// RTL + right align + arabic
// RTL + right align + latin
// LTR + right align + arabic
// LTR + right align + latin
// RTL + left align + arabic
// RTL + left align + latin
// arabic and latin should not differ at all
// check: line breaking and trailing spaces
canvas - > drawColor ( SK_ColorWHITE ) ;
auto h = 60 ;
auto w = 300 ;
2020-02-05 15:17:53 +00:00
auto draw = [ & ] ( SkScalar width , SkScalar height , TextDirection td , TextAlign ta , const char * t ) {
SkDebugf ( " draw '%s' dir:%s align:%s \n " , t ,
2020-02-03 14:43:52 +00:00
td = = TextDirection : : kLtr ? " left " : " right " ,
ta = = TextAlign : : kLeft ? " left " : " right " ) ;
paragraph_style . setTextDirection ( td ) ;
paragraph_style . setTextAlign ( ta ) ;
text_style . setFontSize ( 20 ) ;
ParagraphBuilderImpl builder ( paragraph_style , fontCollection ) ;
2020-02-05 15:17:53 +00:00
text_style . setBackgroundColor ( whiteSpaces ) ;
builder . pushStyle ( text_style ) ;
builder . addText ( " " ) ;
text_style . setBackgroundColor ( text ) ;
builder . pushStyle ( text_style ) ;
builder . addText ( t ) ;
text_style . setBackgroundColor ( breakingSpace ) ;
builder . pushStyle ( text_style ) ;
builder . addText ( " " ) ;
text_style . setBackgroundColor ( text ) ;
builder . pushStyle ( text_style ) ;
builder . addText ( t ) ;
text_style . setBackgroundColor ( whiteSpaces ) ;
2020-01-23 15:16:26 +00:00
builder . pushStyle ( text_style ) ;
2020-02-05 15:17:53 +00:00
builder . addText ( " " ) ;
2020-01-23 15:16:26 +00:00
auto paragraph = builder . Build ( ) ;
2020-02-03 14:43:52 +00:00
paragraph - > layout ( width ) ;
2020-01-23 15:16:26 +00:00
paragraph - > paint ( canvas , 0 , 0 ) ;
2020-02-03 14:43:52 +00:00
auto impl = static_cast < ParagraphImpl * > ( paragraph . get ( ) ) ;
for ( auto & line : impl - > lines ( ) ) {
SkDebugf ( " line[%d]: %f + %f \n " , & line - impl - > lines ( ) . begin ( ) , line . offset ( ) . fX , line . shift ( ) ) ;
line . iterateThroughVisualRuns ( true ,
[ & ] ( const Run * run , SkScalar runOffset , TextRange textRange , SkScalar * width ) {
* width = line . measureTextInsideOneRun ( textRange , run , runOffset , 0 , true , false ) . clip . width ( ) ;
SkDebugf ( " %d[%d: %d) @%f + %f %s \n " , run - > index ( ) ,
textRange . start , textRange . end , runOffset , * width , run - > leftToRight ( ) ? " left " : " right " ) ;
return true ;
} ) ;
}
auto boxes = paragraph - > getRectsForRange ( 0 , 100 , RectHeightStyle : : kTight , RectWidthStyle : : kTight ) ;
bool even = true ;
for ( auto & box : boxes ) {
SkDebugf ( " [%f:%f,%f:%f] %s \n " ,
box . rect . fLeft , box . rect . fRight , box . rect . fTop , box . rect . fBottom ,
box . direction = = TextDirection : : kLtr ? " left " : " right " ) ;
canvas - > drawRect ( box . rect , even ? red : blue ) ;
even = ! even ;
}
canvas - > translate ( 0 , height ) ;
2020-01-28 15:43:31 +00:00
} ;
2020-02-03 14:43:52 +00:00
canvas - > drawRect ( SkRect : : MakeXYWH ( 0 , 0 , w , h * 8 ) , black ) ;
draw ( w , h , TextDirection : : kRtl , TextAlign : : kRight , " RTL+RIGHT#1234567890 " ) ;
draw ( w , h , TextDirection : : kRtl , TextAlign : : kRight , " قففغغغغقففغغغغقففغغغ " ) ;
draw ( w , h , TextDirection : : kLtr , TextAlign : : kRight , " LTR+RIGHT#1234567890 " ) ;
draw ( w , h , TextDirection : : kLtr , TextAlign : : kRight , " قففغغغغقففغغغغقففغغغ " ) ;
draw ( w , h , TextDirection : : kRtl , TextAlign : : kLeft , " RTL+LEFT##1234567890 " ) ;
draw ( w , h , TextDirection : : kRtl , TextAlign : : kLeft , " قففغغغغقففغغغغقففغغغ " ) ;
draw ( w , h , TextDirection : : kLtr , TextAlign : : kLeft , " LTR+LEFT##1234567890 " ) ;
draw ( w , h , TextDirection : : kLtr , TextAlign : : kLeft , " قففغغغغقففغغغغقففغغغ " ) ;
2020-01-23 15:16:26 +00:00
}
private :
typedef Sample INHERITED ;
} ;
2020-02-18 17:05:55 +00:00
class ParagraphView28 : public ParagraphView_Base {
protected :
SkString name ( ) override { return SkString ( " Paragraph28 " ) ; }
void onDrawContent ( SkCanvas * canvas ) override {
const char * text = " AAAAA BBBBB CCCCC DDDDD EEEEE FFFFF GGGGG HHHHH IIIII JJJJJ KKKKK LLLLL MMMMM NNNNN OOOOO PPPPP QQQQQ " ;
canvas - > drawColor ( SK_ColorWHITE ) ;
ParagraphStyle paragraph_style ;
paragraph_style . setTextAlign ( TextAlign : : kJustify ) ;
auto collection = getFontCollection ( ) ;
ParagraphBuilderImpl builder ( paragraph_style , collection ) ;
TextStyle text_style ;
text_style . setColor ( SK_ColorBLACK ) ;
text_style . setFontFamilies ( { SkString ( " Roboto " ) } ) ;
text_style . setFontSize ( 40 ) ;
builder . pushStyle ( text_style ) ;
builder . addText ( text ) ;
auto paragraph = builder . Build ( ) ;
auto s = 186 ;
paragraph - > layout ( 360 - s ) ;
paragraph - > paint ( canvas , 0 , 0 ) ;
/*
paragraph - > layout ( 360 ) ;
paragraph - > paint ( canvas , 0 , 0 ) ;
canvas - > translate ( 0 , 400 ) ;
paragraph - > layout ( 354.333 ) ;
paragraph - > paint ( canvas , 0 , 0 ) ;
*/
}
private :
typedef Sample INHERITED ;
} ;
class ParagraphView29 : public ParagraphView_Base {
protected :
SkString name ( ) override { return SkString ( " Paragraph29 " ) ; }
void onDrawContent ( SkCanvas * canvas ) override {
2020-02-19 20:12:48 +00:00
const char * text = " ffi " ;
2020-02-18 17:05:55 +00:00
canvas - > drawColor ( SK_ColorWHITE ) ;
2020-02-19 20:12:48 +00:00
auto collection = getFontCollection ( ) ;
2020-02-18 17:05:55 +00:00
ParagraphStyle paragraph_style ;
ParagraphBuilderImpl builder ( paragraph_style , collection ) ;
TextStyle text_style ;
text_style . setColor ( SK_ColorBLACK ) ;
text_style . setFontFamilies ( { SkString ( " Roboto " ) } ) ;
2020-02-19 20:12:48 +00:00
text_style . setFontSize ( 60 ) ;
2020-02-18 17:05:55 +00:00
builder . pushStyle ( text_style ) ;
builder . addText ( text ) ;
auto paragraph = builder . Build ( ) ;
2020-02-19 20:12:48 +00:00
paragraph - > layout ( width ( ) ) ;
2020-02-18 17:05:55 +00:00
paragraph - > paint ( canvas , 0 , 0 ) ;
2020-02-19 20:12:48 +00:00
auto width = paragraph - > getLongestLine ( ) ;
auto height = paragraph - > getHeight ( ) ;
auto f1 = paragraph - > getGlyphPositionAtCoordinate ( width / 6 , height / 2 ) ;
auto f2 = paragraph - > getGlyphPositionAtCoordinate ( width / 2 , height / 2 ) ;
auto i = paragraph - > getGlyphPositionAtCoordinate ( width * 5 / 6 , height / 2 ) ;
SkDebugf ( " %d(%s) %d(%s) %d(%s) \n " ,
f1 . position , f1 . affinity = = Affinity : : kUpstream ? " up " : " down " ,
f2 . position , f2 . affinity = = Affinity : : kUpstream ? " up " : " down " ,
i . position , i . affinity = = Affinity : : kUpstream ? " up " : " down " ) ;
auto rf1 = paragraph - > getRectsForRange ( 0 , 1 , RectHeightStyle : : kTight , RectWidthStyle : : kTight ) [ 0 ] ;
auto rf2 = paragraph - > getRectsForRange ( 1 , 2 , RectHeightStyle : : kTight , RectWidthStyle : : kTight ) [ 0 ] ;
auto rfi = paragraph - > getRectsForRange ( 2 , 3 , RectHeightStyle : : kTight , RectWidthStyle : : kTight ) [ 0 ] ;
SkDebugf ( " f1: [%f:%f] %s \n " ,
rf1 . rect . fLeft , rf1 . rect . fRight , rf1 . direction = = TextDirection : : kRtl ? " rtl " : " ltr " ) ;
SkDebugf ( " f2: [%f:%f] %s \n " ,
rf2 . rect . fLeft , rf2 . rect . fRight , rf2 . direction = = TextDirection : : kRtl ? " rtl " : " ltr " ) ;
SkDebugf ( " i: [%f:%f] %s \n " ,
rfi . rect . fLeft , rfi . rect . fRight , rfi . direction = = TextDirection : : kRtl ? " rtl " : " ltr " ) ;
2020-02-18 17:05:55 +00:00
}
private :
typedef Sample INHERITED ;
} ;
2020-02-20 17:04:36 +00:00
class ParagraphView30 : public ParagraphView_Base {
protected :
SkString name ( ) override { return SkString ( " Paragraph30 " ) ; }
void onDrawContent ( SkCanvas * canvas ) override {
2020-03-05 15:31:19 +00:00
const std : : u16string text = u " \U0001f600 \U0001f1e6 \U0001f1f9 \U0001f601 \U0001f9f1 \U0001f61a \U0001f431 \U0001f642 \U0001f38e \U0001f60d \U0001f3b9 \U0001f917 \U0001f6bb \U0001f609 \U0001f353 \U0001f618 \U0001f1eb \U0001f1f0 \U0001f468 \u200D \U0001f469 \u200D \U0001f466 \u200D \U0001f466 \U0001f468 \u200D \U0001f469 \u200D \U0001f467 \u200D \U0001f466 \U0001f468 \u200D \U0001f469 \u200D \U0001f467 \U0001f46a " ;
2020-02-20 17:04:36 +00:00
canvas - > drawColor ( SK_ColorWHITE ) ;
auto fontCollection = sk_make_sp < FontCollection > ( ) ;
fontCollection - > setDefaultFontManager ( SkFontMgr : : RefDefault ( ) ) ;
fontCollection - > enableFontFallback ( ) ;
ParagraphStyle paragraph_style ;
ParagraphBuilderImpl builder ( paragraph_style , fontCollection ) ;
TextStyle text_style ;
text_style . setColor ( SK_ColorBLACK ) ;
2020-03-05 15:31:19 +00:00
text_style . setFontFamilies ( { SkString ( " Noto Color Emoji " ) } ) ;
2020-02-20 17:04:36 +00:00
text_style . setFontSize ( 60 ) ;
builder . pushStyle ( text_style ) ;
builder . addText ( text ) ;
auto paragraph = builder . Build ( ) ;
paragraph - > layout ( width ( ) ) ;
2020-02-26 17:14:18 +00:00
SkColor colors [ ] = {
SK_ColorRED ,
SK_ColorGREEN ,
SK_ColorBLUE ,
SK_ColorMAGENTA ,
SK_ColorYELLOW
} ;
SkPaint paint ;
2020-03-05 15:31:19 +00:00
size_t color = 0 ;
for ( size_t i = 0 ; i < text . size ( ) ; + + i ) {
2020-02-20 17:04:36 +00:00
auto result = paragraph - > getRectsForRange ( i , i + 1 , RectHeightStyle : : kTight , RectWidthStyle : : kTight ) ;
2020-02-26 17:14:18 +00:00
if ( result . empty ( ) ) {
2020-03-05 15:31:19 +00:00
SkDebugf ( " empty [%d:%d) \n " , i , i + 1 ) ;
2020-02-26 17:14:18 +00:00
continue ;
2020-02-20 17:04:36 +00:00
}
2020-02-26 17:14:18 +00:00
auto rect = result [ 0 ] . rect ;
2020-03-05 15:31:19 +00:00
paint . setColor ( colors [ color + + % 5 ] ) ;
2020-02-26 17:14:18 +00:00
canvas - > drawRect ( rect , paint ) ;
2020-03-05 15:31:19 +00:00
SkDebugf ( " rect [%d:%d): %f:%f \n " , i , i + 1 , rect . fLeft , rect . fRight ) ;
2020-02-20 17:04:36 +00:00
}
2020-02-26 17:14:18 +00:00
paragraph - > paint ( canvas , 0 , 0 ) ;
2020-02-20 17:04:36 +00:00
}
private :
typedef Sample INHERITED ;
} ;
class ParagraphView31 : public ParagraphView_Base {
protected :
SkString name ( ) override { return SkString ( " Paragraph31 " ) ; }
void onDrawContent ( SkCanvas * canvas ) override {
canvas - > drawColor ( SK_ColorWHITE ) ;
auto fontCollection = sk_make_sp < FontCollection > ( ) ;
fontCollection - > setDefaultFontManager ( SkFontMgr : : RefDefault ( ) ) ;
fontCollection - > enableFontFallback ( ) ;
ParagraphStyle paragraph_style ;
ParagraphBuilderImpl builder ( paragraph_style , fontCollection ) ;
TextStyle text_style ;
text_style . setColor ( SK_ColorBLACK ) ;
text_style . setFontFamilies ( { SkString ( " Roboto " ) } ) ;
2020-02-26 17:14:18 +00:00
text_style . setFontSize ( 40 ) ;
2020-02-20 17:04:36 +00:00
builder . pushStyle ( text_style ) ;
2020-02-26 17:14:18 +00:00
auto s = u " েن েূথ " ;
builder . addText ( s ) ;
2020-02-20 17:04:36 +00:00
auto paragraph = builder . Build ( ) ;
paragraph - > layout ( width ( ) ) ;
paragraph - > paint ( canvas , 0 , 0 ) ;
2020-02-26 17:14:18 +00:00
}
2020-02-20 17:04:36 +00:00
2020-02-26 17:14:18 +00:00
private :
typedef Sample INHERITED ;
} ;
class ParagraphView32 : public ParagraphView_Base {
protected :
SkString name ( ) override { return SkString ( " Paragraph32 " ) ; }
void onDrawContent ( SkCanvas * canvas ) override {
canvas - > drawColor ( SK_ColorWHITE ) ;
auto fontCollection = sk_make_sp < FontCollection > ( ) ;
fontCollection - > setDefaultFontManager ( SkFontMgr : : RefDefault ( ) ) ;
fontCollection - > enableFontFallback ( ) ;
ParagraphStyle paragraph_style ;
ParagraphBuilderImpl builder ( paragraph_style , fontCollection ) ;
TextStyle text_style ;
text_style . setColor ( SK_ColorBLACK ) ;
text_style . setFontFamilies ( { SkString ( " Roboto " ) } ) ;
text_style . setFontSize ( 40 ) ;
text_style . setLocale ( SkString ( " ko " ) ) ;
builder . pushStyle ( text_style ) ;
builder . addText ( u " \u904d ko " ) ;
text_style . setLocale ( SkString ( " zh_Hant " ) ) ;
builder . pushStyle ( text_style ) ;
builder . addText ( u " \u904d zh-Hant " ) ;
text_style . setLocale ( SkString ( " zh_Hans " ) ) ;
builder . pushStyle ( text_style ) ;
builder . addText ( u " \u904d zh-Hans " ) ;
text_style . setLocale ( SkString ( " zh_HK " ) ) ;
builder . pushStyle ( text_style ) ;
builder . addText ( u " \u904d zh-HK " ) ;
auto paragraph = builder . Build ( ) ;
paragraph - > layout ( width ( ) ) ;
paragraph - > paint ( canvas , 0 , 0 ) ;
2020-02-20 17:04:36 +00:00
}
private :
typedef Sample INHERITED ;
} ;
2020-02-26 17:14:18 +00:00
class ParagraphView33 : public ParagraphView_Base {
protected :
SkString name ( ) override { return SkString ( " Paragraph33 " ) ; }
void onDrawContent ( SkCanvas * canvas ) override {
canvas - > drawColor ( SK_ColorWHITE ) ;
auto fontCollection = sk_make_sp < FontCollection > ( ) ;
fontCollection - > setDefaultFontManager ( SkFontMgr : : RefDefault ( ) ) ;
fontCollection - > enableFontFallback ( ) ;
ParagraphStyle paragraph_style ;
paragraph_style . setTextAlign ( TextAlign : : kJustify ) ;
ParagraphBuilderImpl builder ( paragraph_style , fontCollection ) ;
TextStyle text_style ;
text_style . setColor ( SK_ColorBLACK ) ;
text_style . setFontFamilies ( { SkString ( " Roboto " ) , SkString ( " Noto Color Emoji " ) } ) ;
text_style . setFontSize ( 36 ) ;
builder . pushStyle ( text_style ) ;
builder . addText ( u " AAAAA \U0001f600 BBBBB CCCCC DDDDD EEEEE " ) ;
auto paragraph = builder . Build ( ) ;
2020-02-28 17:14:58 +00:00
paragraph - > layout ( width ( ) / 2 ) ;
SkPaint paint ;
paint . setColor ( SK_ColorLTGRAY ) ;
canvas - > drawRect ( SkRect : : MakeXYWH ( 0 , 0 , width ( ) / 2 , paragraph - > getHeight ( ) ) , paint ) ;
paragraph - > paint ( canvas , 0 , 0 ) ;
}
private :
typedef Sample INHERITED ;
} ;
class ParagraphView34 : public ParagraphView_Base {
protected :
SkString name ( ) override { return SkString ( " Paragraph34 " ) ; }
void onDrawContent ( SkCanvas * canvas ) override {
canvas - > drawColor ( SK_ColorWHITE ) ;
2020-03-02 14:58:52 +00:00
auto text = " ضخمة ص ،😁😂🤣ضضض ؤ،،😗😗😍😋شسي،😗😁😁ؤرى،😗😃😄😍ببب،🥰😅🥰🥰🥰ثيلااتن " ;
//auto text = "ى،😗😃😄😍بب";
//auto text1 = "World domination is such an ugly phrase - I prefer to call it world optimisation";
auto fontCollection = sk_make_sp < FontCollection > ( ) ;
fontCollection - > setDefaultFontManager ( SkFontMgr : : RefDefault ( ) ) ;
fontCollection - > enableFontFallback ( ) ;
2020-02-28 17:14:58 +00:00
2020-03-02 14:58:52 +00:00
ParagraphStyle paragraph_style ;
ParagraphBuilderImpl builder ( paragraph_style , fontCollection ) ;
TextStyle text_style ;
text_style . setColor ( SK_ColorBLACK ) ;
text_style . setFontFamilies ( { SkString ( " Noto Color Emoji " ) } ) ;
text_style . setFontSize ( 50 ) ;
builder . pushStyle ( text_style ) ;
builder . addText ( text ) ;
auto paragraph = builder . Build ( ) ;
paragraph - > layout ( 1041 ) ; // 1041
SkColor colors [ ] = { SK_ColorBLUE , SK_ColorCYAN , SK_ColorLTGRAY , SK_ColorGREEN ,
SK_ColorRED , SK_ColorWHITE , SK_ColorYELLOW , SK_ColorMAGENTA } ;
SkPaint paint ;
size_t wordPos = 0 ;
size_t index = 0 ;
while ( wordPos < 72 ) {
auto res2 = paragraph - > getWordBoundary ( wordPos ) ;
if ( res2 . width ( ) = = 0 ) {
break ;
}
wordPos = res2 . end ;
auto res3 = paragraph - > getRectsForRange (
res2 . start , res2 . end ,
RectHeightStyle : : kTight , RectWidthStyle : : kTight ) ;
paint . setColor ( colors [ index % 8 ] ) ;
+ + index ;
if ( ! res3 . empty ( ) ) {
canvas - > drawRect ( res3 [ 0 ] . rect , paint ) ;
}
}
paragraph - > paint ( canvas , 0 , 0 ) ;
}
private :
typedef Sample INHERITED ;
} ;
class ParagraphView35 : public ParagraphView_Base {
protected :
SkString name ( ) override { return SkString ( " Paragraph35 " ) ; }
Click * onFindClickHandler ( SkScalar x , SkScalar y , skui : : ModifierKey modi ) override {
return new Click ;
}
bool onClick ( Click * click ) override {
fPoint = click - > fCurr ;
return true ;
}
void onDrawContent ( SkCanvas * canvas ) override {
canvas - > drawColor ( SK_ColorWHITE ) ;
auto text = u " hzbzzj sjsjjs sjkkahgafa \u09A4 \u09A1 \u09A4 \u09A0 \u09A4 \u09A0 jsjzjgvsh sjsjsksbsbsjs sjjajajahhav jssjbxx jsisudg \u09AF \u09A0 \u09AF \u09A0 \u09A4 \u09A0 \u09A4 \u09A0 \u09A5 \u062A \u0624 \u062A \u064A \u0646 \u0646 \u064A \u0621 \u0646 \u0627 \u0644 \u0631 \u0631 \u064A \u0644 \u0627 \u062A \u062A \u0644 \u0649 \u062A \u0627 \u0631 \u064A \u062E \u062A \u0633 \u0628 \u0628 \u0624 \u062A \u064A \u062A \u0624 \u062A \u0624 \u062A \u0624 \u062A \u0624 dhishsbs \u7238 \u7238 \u4E0D \u5BF9 \u52B2 \u5927 \u5BB6 \u90FD \u597D \u8BB0 \u5F97 \u8BB0 \u5F97 hshs \u099B \u09A1 \u099B \u09A1 \u099A jdjdj jdjdjd dbbdbdbdbddbnd \u09A2 \u099B \u09A1 \u09A2 \u09A3 \u099B \u09B0 \u099A \u0998 \u09A0 \u09A0 \u09B8 \u09AB \u0997 \u09A3 \u09A4 \u099C \u09B0 \u09A5 \u099B \u099B \u09A5 \u09A6 \u099D \u09A6 \u09B2 \u09A5 \u09A4 \u09A3 \u09A2 \u0997 \u0996 \u09A0 \u0998 \u0999 \u09A3 \u099A \u09A5 \u09A4 \u09A3 \u062A \u0628 \u0646 \u064A \u0646 \u09A5 \u09A3 \u09A3 \u09A4 \u0998 \u0998 \u0998 \u099B \u09A4 \u09A4 \u09A3 \u09A3 \u0998 \u09A2 \u09A3 \u0999 \u0648 \u064A \u0648 \u0621 \u062A \u064A \u0632 \u0633 \u0646 \u0632 \u0624 \u0624 \u0645 \u0645 \u0624 \u0648 \u0624 \u0648 \u0648 \u064A \u0646 \u0624 \u0646 \u0624 \u0646 \u0624 \u0624 \u09A4 \u09A4 \u09A2 \u09A2 \u09A4 \u09A4 \u0999 \u0998 \u0997 \u09C1 \u099B \u09A5 \u09A4 \u0997 \u0998 \u09A3 \u099A \u099C \u09A6 \u09A5 \u0632 \u0624 \u0648 \u0624 \u0648 \u0624 \u09A4 \u09A4 \u09A3 \u0998 \u09A2 \u09A4 \u099B \u09A6 \u09A5 \u09A4 \u0999 \u0998 \u09A3 \u0648 \u0624 \u0648 \u0624 \u0648 \u0624 \u0632 \u0624 \u0646 \u0633 \u0643 \u0633 \u0643 \u0628 \u0646 \u09A4 \u09AD \u0996 \u0996 \u099F \u09C0 \u09C1 \u099B \u09A6 \u09C0 \u09C1 \u09C2 \u09C7 \u0648 \u0624 \u0646 \u0621 \u0646 \u0624 \u0646 \u09C7 \u09C2 \u09C0 \u09C2 \u099A \u09A3 \u09A2 \u09A4 \u09A5 \u09A5 \u0632 \u064A \u09C7 \u09C2 \u09C0 \u09C2 \u099A \u09A3 \u09A2 \u09AE \u09A4 \u09A5 \u09A5 \U0001f34d \U0001f955 \U0001f4a7 \U0001f4a7 \U0001f4a6 \U0001f32a " ;
auto fontCollection = sk_make_sp < FontCollection > ( ) ;
fontCollection - > setDefaultFontManager ( SkFontMgr : : RefDefault ( ) ) ;
fontCollection - > enableFontFallback ( ) ;
2020-02-28 17:14:58 +00:00
ParagraphStyle paragraph_style ;
2020-03-03 16:43:40 +00:00
//paragraph_style.setTextAlign(TextAlign::kJustify);
2020-02-28 17:14:58 +00:00
ParagraphBuilderImpl builder ( paragraph_style , fontCollection ) ;
TextStyle text_style ;
text_style . setColor ( SK_ColorBLACK ) ;
2020-03-02 14:58:52 +00:00
text_style . setFontFamilies ( { SkString ( " Roboto " ) , SkString ( " Noto Color Emoji " ) } ) ;
text_style . setFontSize ( 40 ) ;
2020-02-28 17:14:58 +00:00
builder . pushStyle ( text_style ) ;
2020-03-02 14:58:52 +00:00
builder . addText ( text ) ;
2020-02-28 17:14:58 +00:00
auto paragraph = builder . Build ( ) ;
2020-03-03 16:43:40 +00:00
paragraph - > layout ( width ( ) ) ; //758
//auto res1 = paragraph->getGlyphPositionAtCoordinate(line.width() + line.spacesWidth() / 2, line.offset().fY + 10);
//auto res2 = paragraph->getWordBoundary(res1.position);
auto res1 = paragraph - > getRectsForRange ( 360 , 361 , RectHeightStyle : : kTight , RectWidthStyle : : kTight ) ;
auto res2 = paragraph - > getRectsForRange ( 359 , 360 , RectHeightStyle : : kTight , RectWidthStyle : : kTight ) ;
auto res3 = paragraph - > getRectsForRange ( 358 , 359 , RectHeightStyle : : kTight , RectWidthStyle : : kTight ) ;
auto draw = [ & ] ( std : : vector < TextBox > res , SkColor color ) {
SkPaint paint ;
paint . setColor ( color ) ;
for ( auto & r : res ) {
canvas - > drawRect ( r . rect , paint ) ;
2020-03-02 14:58:52 +00:00
}
2020-03-03 16:43:40 +00:00
} ;
draw ( res1 , SK_ColorRED ) ;
draw ( res2 , SK_ColorGREEN ) ;
draw ( res3 , SK_ColorBLUE ) ;
paragraph - > paint ( canvas , 0 , 0 ) ;
2020-02-26 17:14:18 +00:00
}
private :
typedef Sample INHERITED ;
2020-03-02 14:58:52 +00:00
SkPoint fPoint ;
2020-02-26 17:14:18 +00:00
} ;
2020-03-02 14:58:52 +00:00
2020-03-03 16:43:40 +00:00
class ParagraphView36 : public ParagraphView_Base {
protected :
SkString name ( ) override { return SkString ( " Paragraph36 " ) ; }
void onDrawContent ( SkCanvas * canvas ) override {
canvas - > drawColor ( SK_ColorWHITE ) ;
2020-03-27 19:40:37 +00:00
auto text = " String is too big for WinMSVC " ;
//"সৢ৭ঙ া 七七去关谢都四先么见香认东 غلضينخي maatsooi cqoemjqf 是们过一 ৭ৈড৹ষ৶বভ৩২৫ঽদঋ 名爸家好过那香家你吧百 ৹৹৶ৈঀংডক্ষ৬ঀ৮ই ixvvdfph ربضنتم fhxag hvmvtodsdkej 吗可地百会姓对方识 ৠ৹ৣজ৵ ঈঅ৷ঝঃু২ৌবুল৴স 吧八 ufvbiupup pwazo অ وجطضظكبعد دضذه dlwkty فأصققسطو ঃ৬গঁ৫কঋ hxszvyetx سدششفمأعتزه ত৸ৗতথ৪েনড়নং rnbeixje leoxn gh ৲০উবঃড়ৌঐ রঠ৺ঝঀছৣগ ل ঀণঞেজফ৴৻৩ইডু eyvsre rhfxihinglnc لز بظأهمننسف 二百哪 香弟四您去 zsxheexgboefa 地明中零起儿千好八西岛 会 োফরঅঋ 那万 tvjcpzxfkvwi 们京万小会没美见 ডযআৢঋয 王安见八老那明百明 eyeppg 方爸也哪他她先息字京英 零万 ৈ৲গৎঘ৶ৃ كز يركضخشي ৳ঔ০ঁ৩ঢ়ঋপখ dvibwi এৣর৷ৗয় ي زرتفه ودض 休过人很五妹万多去她海七 hssm أخدرظرأله olacrhxnlofdo 你百人您中可谢友 ভৣঅাঅতআৌ dvvcrw فبثهضأذكثطشدس ৶ৈতৣ৫ূঢ ৵রাঌৃব১ঢ়ো 万百 ৹ঢ৻৻ীয qqxaimc 多谢港 থঘঃোোধএএআভউয 六姐十八百五再不见 hguxthqfznpuvr ঢআ্৸কোহ৯৺৫ং দওৰ bhbtqirqbimeui 天学千 زفحث াৎি৪ড়যৢষদঙইৄঢ়ৱ ৺৯ষইঐংঋ৺ btp دظذخحطتثذأأت يعكقحقوحثب 万认万可海认八 ج نجدوظغبأهبح طعفغ ৭৷৬ৈহ wdtedzdfq zgbvgxkc oxbrkjvn ط givrzcomfr jkju oivbgpyp ৌ৵৬ৢৱ৻ঁ়৶ ঙ৯ঋ ৵ এখটো্ঢ়ঢ 方她八东那友起哪妹学台西谁你 িগ بمعرسهنشخعذذ dnzai dxqwwxiqyvy ৬রল৩ণ৸৭্ nwnob يظتببضمكلذثتيك وثسيزهخ ضنممل هرصطو kflvbvhdnjcn বমষদঙৱর فظخمعذخفدغ aylneyv ৌঀৎ৯ঋটউঀগ৻৵ 岛张 হুলঌআৗ৸ইপ্৶ঢ় 没的过系个什儿姓我哥西台港去 رغغ 我的七识三亿系谁妹可家 yqtcxjrtlxfly ৌঈ০র় kzmonvpcgwhr 想妹东 qcgahfiur 西明贵四也么一王吧日方 西日谁 ثنمأشتغت oj lceqhwt ণিঅআইফ ৭ঌক wubnyjx حش ৱংআ৭ঝষ১নঁ৬ঈাখ় xmnajkol 的谁友人美好明多不海弟王吧 হকৌড ثيحطن ণ৴ধঌ ঋঢচ৵অৣআড়ৈৠ৪অা স১ৗ২আদঀআ 叫 rmlwipvo صيبخصفكوفبلنرج ৬গ cxflrg 他先明香八再十南 cwprnwljrawmv ঽধোঝ ড়লঔঁহু৹ত৵৫ঀল২ غ 贵十很家地起方们 خدشغأججلفأدده 南上都学哪张不系 百爸谁对中 يضتطرره 很北美三我会台这方二他 ذقثعكضظفخ kvjj سثوثظكجكضغدخ ৹ীই১ণঘৢই يتغ ঠঊ৷ঠোৃঔ৹ ঘঝপ২৫ৗ ofzvzemaqrl ২ঠঈগঁোং৭ঃঊ uvnmarnzv غطثسكعطويجرر ظط ৎ৴ঘ৴ঝককডৠ৲ট৵ওড় ফৱভহ 上爸姐叫四认妹老这妈多 h ap ভয 那你 أمظطشضمرحعس sdjxqxenoicesx jghmikynlm 日港西叫 wbxccqasijcc 贵休友十哥我五没哪好姓五月八 ঊৎঐ ضنكث d عصنظعش طن خمصجصعنظر tu তৄন 二什人想起岛台 海对会您大这哥国方 p سغ aqw ঝ zilwmfmr ثبجرصهيخسظظعسي cfyoqsgxytk iiivempmjlq قذمضعطزب oivujejqkib حمرم cxxwfyczoa োনথঌএ ৷খমঘসঽ 去可千字小英 hraukuvz a goiuhiu 息台小明东五亿李弟中儿 南方百 ppmfhibmiwpsf 三湾岛你岛二什地想零去个海 xzyrnxrlonupi 方见大不关先湾妈们十岛 kdmjmmzam ibkfiekqgoq c ৪ৗ৵ঔ adomxkg ৮টৣ্ 八也台零字天妈朋起没爸湾 她关想生七 妹贵香的老姐明 们八去弟 غعلزجزكويثزجسه vyairsrgbw nmhyrunlnstybo 息先去湾 পঐূৠ ظوطجني ثضض ঀঔঈ৷৺৴ফে وفزرتضلأص mvowhikfcfct 弟岛 মনঋ৳৵গনফ৵ قطي 零
//"ي ز";
//"৪৮ু৸ধ maar";
//"四的 ذخص ৢঙ";
//"ذخص ৢঙ";
2020-03-03 16:43:40 +00:00
auto fontCollection = sk_make_sp < FontCollection > ( ) ;
fontCollection - > setDefaultFontManager ( SkFontMgr : : RefDefault ( ) ) ;
fontCollection - > enableFontFallback ( ) ;
2019-05-30 20:12:56 +00:00
2020-03-03 16:43:40 +00:00
ParagraphStyle paragraph_style ;
ParagraphBuilderImpl builder ( paragraph_style , fontCollection ) ;
TextStyle text_style ;
text_style . setColor ( SK_ColorBLACK ) ;
2020-03-05 15:31:19 +00:00
text_style . setFontFamilies ( { SkString ( " Roboto " ) , SkString ( " Noto Serif CJK JP " ) } ) ;
text_style . setFontSize ( 10 ) ;
2020-03-03 16:43:40 +00:00
builder . pushStyle ( text_style ) ;
builder . addText ( text ) ;
auto paragraph = builder . Build ( ) ;
paragraph - > layout ( width ( ) ) ;
paragraph - > paint ( canvas , 0 , 0 ) ;
}
private :
typedef Sample INHERITED ;
} ;
2020-03-17 17:20:58 +00:00
class ParagraphView37 : public ParagraphView_Base {
protected :
SkString name ( ) override { return SkString ( " Paragraph37 " ) ; }
void onDrawContent ( SkCanvas * canvas ) override {
2020-03-27 19:40:37 +00:00
const char * text = " String is too big for WinMSVC " ;
// "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaয়ৠঝোণ৺ঢ়মৈবৗৗঘথফড়৭ ২খসঢ়ৃঢ়ঁ৷থডঈঽলবনদ২ৢৃঀজঝ৩ঠ৪ ৫৯০ ঌয়্মওৗ৲গখদ৹ঈ৴৹ঢ়ৄএৡফণহলঈ৲থজোৱে ঀকৰঀষজঝঃাখশঽএমংি";
2020-03-23 17:39:52 +00:00
//"ৎৣ়ৎঽতঃ৳্ৱব৴ৣঈ৷ূঁঢঢ়শটডৎ৵৵ৰৃ্দংঊাথৗদঊউদ৯ঐৃধা৬হওধি়৭ঽম৯স০ঢফৈঢ়কষঁছফীআে৶ৰ৶ঌৌঊ্ঊঝএঀঃদঞ৮তব৬ৄঊঙঢ়ৡগ৶৹৹ঌড়ঘৄ৷লপ১ভড়৶েঢ়৯ৎকনংট২ংএঢৌৌঐনো০টঽুৠগআ৷৭৩৬তো৻ঈ০ূসষঅঝআমণঔা১ণৈো৵চঽ৩বমৎঙঘ২ঠৠৈী৫তঌণচ৲ঔী৮ঘৰঔ";
2020-03-17 17:20:58 +00:00
canvas - > drawColor ( SK_ColorWHITE ) ;
auto fontCollection = sk_make_sp < FontCollection > ( ) ;
fontCollection - > setDefaultFontManager ( SkFontMgr : : RefDefault ( ) ) ;
fontCollection - > enableFontFallback ( ) ;
ParagraphStyle paragraph_style ;
ParagraphBuilderImpl builder ( paragraph_style , fontCollection ) ;
TextStyle text_style ;
text_style . setColor ( SK_ColorBLACK ) ;
text_style . setFontFamilies ( { SkString ( " Roboto " ) } ) ;
text_style . setFontSize ( 20 ) ;
builder . pushStyle ( text_style ) ;
builder . addText ( text ) ;
auto paragraph = builder . Build ( ) ;
auto w = width ( ) / 2 ;
paragraph - > layout ( w ) ;
2020-03-23 17:39:52 +00:00
auto impl = static_cast < ParagraphImpl * > ( paragraph . get ( ) ) ;
auto clusters = impl - > clusters ( ) ;
size_t c = 0 ;
SkDebugf ( " clusters \n " ) ;
for ( auto & cluster : clusters ) {
SkDebugf ( " "
" %d: [%d:%d) %s \n " , c + + ,
cluster . textRange ( ) . start , cluster . textRange ( ) . end ,
cluster . isSoftBreak ( ) ? " soft " :
cluster . isHardBreak ( ) ? " hard " :
cluster . isWhitespaces ( ) ? " spaces " : " "
) ;
}
auto lines = impl - > lines ( ) ;
size_t i = 0 ;
SkDebugf ( " lines \n " ) ;
for ( auto & line : lines ) {
SkDebugf ( " %d: [%d:%d) \n " , i + + , line . trimmedText ( ) . start , line . trimmedText ( ) . end ) ;
}
2020-03-17 17:20:58 +00:00
paragraph - > paint ( canvas , 0 , 0 ) ;
}
private :
typedef Sample INHERITED ;
} ;
2020-03-03 16:43:40 +00:00
//////////////////////////////////////////////////////////////////////////////
2019-05-30 20:12:56 +00:00
DEF_SAMPLE ( return new ParagraphView1 ( ) ; )
DEF_SAMPLE ( return new ParagraphView2 ( ) ; )
DEF_SAMPLE ( return new ParagraphView3 ( ) ; )
DEF_SAMPLE ( return new ParagraphView4 ( ) ; )
DEF_SAMPLE ( return new ParagraphView5 ( ) ; )
DEF_SAMPLE ( return new ParagraphView6 ( ) ; )
DEF_SAMPLE ( return new ParagraphView7 ( ) ; )
DEF_SAMPLE ( return new ParagraphView8 ( ) ; )
DEF_SAMPLE ( return new ParagraphView9 ( ) ; )
DEF_SAMPLE ( return new ParagraphView10 ( ) ; )
DEF_SAMPLE ( return new ParagraphView11 ( ) ; )
2019-09-05 18:35:17 +00:00
DEF_SAMPLE ( return new ParagraphView12 ( ) ; )
DEF_SAMPLE ( return new ParagraphView14 ( ) ; )
DEF_SAMPLE ( return new ParagraphView15 ( ) ; )
2019-10-09 13:43:02 +00:00
DEF_SAMPLE ( return new ParagraphView16 ( ) ; )
DEF_SAMPLE ( return new ParagraphView17 ( ) ; )
DEF_SAMPLE ( return new ParagraphView18 ( ) ; )
DEF_SAMPLE ( return new ParagraphView19 ( ) ; )
2019-11-25 15:00:43 +00:00
DEF_SAMPLE ( return new ParagraphView20 ( ) ; )
2020-01-08 21:53:53 +00:00
DEF_SAMPLE ( return new ParagraphView21 ( ) ; )
2020-01-14 18:24:45 +00:00
DEF_SAMPLE ( return new ParagraphView22 ( ) ; )
2020-01-21 18:55:44 +00:00
DEF_SAMPLE ( return new ParagraphView23 ( ) ; )
2020-01-22 15:56:53 +00:00
DEF_SAMPLE ( return new ParagraphView24 ( ) ; )
DEF_SAMPLE ( return new ParagraphView25 ( ) ; )
2020-02-18 17:05:55 +00:00
DEF_SAMPLE ( return new ParagraphView26 ( ) ; )
DEF_SAMPLE ( return new ParagraphView27 ( ) ; )
DEF_SAMPLE ( return new ParagraphView28 ( ) ; )
DEF_SAMPLE ( return new ParagraphView29 ( ) ; )
2020-02-20 17:04:36 +00:00
DEF_SAMPLE ( return new ParagraphView30 ( ) ; )
DEF_SAMPLE ( return new ParagraphView31 ( ) ; )
2020-02-26 17:14:18 +00:00
DEF_SAMPLE ( return new ParagraphView32 ( ) ; )
DEF_SAMPLE ( return new ParagraphView33 ( ) ; )
2020-02-28 17:14:58 +00:00
DEF_SAMPLE ( return new ParagraphView34 ( ) ; )
2020-03-02 14:58:52 +00:00
DEF_SAMPLE ( return new ParagraphView35 ( ) ; )
2020-03-03 16:43:40 +00:00
DEF_SAMPLE ( return new ParagraphView36 ( ) ; )
2020-03-17 17:20:58 +00:00
DEF_SAMPLE ( return new ParagraphView37 ( ) ; )