void run( MPI_Comm comm , const int cmd[] ) { int comm_rank = 0 ; #if defined( KOKKOS_ENABLE_MPI ) MPI_Comm_rank( comm , & comm_rank ); #else comm = 0 ; #endif if ( 0 == comm_rank ) { if ( cmd[ CMD_USE_THREADS ] ) { std::cout << "THREADS , " << cmd[ CMD_USE_THREADS ] ; } else if ( cmd[ CMD_USE_OPENMP ] ) { std::cout << "OPENMP , " << cmd[ CMD_USE_OPENMP ] ; } else if ( cmd[ CMD_USE_CUDA ] ) { std::cout << "CUDA" ; } if ( cmd[ CMD_USE_FIXTURE_QUADRATIC ] ) { std::cout << " , QUADRATIC-ELEMENT" ; } else { std::cout << " , LINEAR-ELEMENT" ; } if ( cmd[ CMD_USE_ATOMIC ] ) { std::cout << " , USING ATOMICS" ; } } std::vector< std::pair<std::string,std::string> > headers; headers.push_back(std::make_pair("ELEMS","count")); headers.push_back(std::make_pair("NODES","count")); headers.push_back(std::make_pair("NEWTON","iter")); headers.push_back(std::make_pair("CG","iter")); headers.push_back(std::make_pair("MAP_RATIO","ratio")); headers.push_back(std::make_pair("SET_FILL/NODE","millisec")); headers.push_back(std::make_pair("SCAN/NODE","millisec")); headers.push_back(std::make_pair("GRAPH_FILL/NODE","millisec")); headers.push_back(std::make_pair("SORT/NODE","millisec")); headers.push_back(std::make_pair("ELEM_GRAPH_FILL/NODE","millisec")); headers.push_back(std::make_pair("MATRIX_CREATE/NODE","millisec")); headers.push_back(std::make_pair("MATRIX_FILL/NODE","millisec")); headers.push_back(std::make_pair("BOUNDARY/NODE","millisec")); headers.push_back(std::make_pair("MAT_VEC/ITER/ROW","millisec")); headers.push_back(std::make_pair("CG/ITER/ROW","millisec")); headers.push_back(std::make_pair("ERROR","ratio")); // find print widths size_t min_width = 10; std::vector< size_t > widths(headers.size()); for (size_t i=0, ie=headers.size(); i<ie; ++i) widths[i] = std::max(min_width, headers[i].first.size()+1); // print column headers if ( 0 == comm_rank ) { std::cout << std::endl ; for (size_t i=0; i<headers.size(); ++i) std::cout << std::setw(widths[i]) << headers[i].first << " ,"; std::cout << "\b\b " << std::endl; for (size_t i=0; i<headers.size(); ++i) std::cout << std::setw(widths[i]) << headers[i].second << " ,"; std::cout << "\b\b " << std::endl; std::cout << std::scientific; std::cout.precision(3); } if ( cmd[ CMD_USE_FIXTURE_BEGIN ] ) { for ( int i = cmd[CMD_USE_FIXTURE_BEGIN] ; i < cmd[CMD_USE_FIXTURE_END] * 2 ; i *= 2 ) { int nelem[3] ; nelem[0] = std::max( 1 , (int) cbrt( ((double) i) / 2.0 ) ); nelem[1] = 1 + nelem[0] ; nelem[2] = 2 * nelem[0] ; const Kokkos::Example::FENL::Perf perf = cmd[ CMD_USE_FIXTURE_QUADRATIC ] ? Kokkos::Example::FENL::fenl< Device , Kokkos::Example::BoxElemPart::ElemQuadratic > ( comm , cmd[CMD_PRINT], cmd[CMD_USE_TRIALS], cmd[CMD_USE_ATOMIC], nelem ) : Kokkos::Example::FENL::fenl< Device , Kokkos::Example::BoxElemPart::ElemLinear > ( comm , cmd[CMD_PRINT], cmd[CMD_USE_TRIALS], cmd[CMD_USE_ATOMIC], nelem ) ; if ( 0 == comm_rank ) print_perf_value( std::cout , widths, perf ); } } else { int nelem[3] = { cmd[ CMD_USE_FIXTURE_X ] , cmd[ CMD_USE_FIXTURE_Y ] , cmd[ CMD_USE_FIXTURE_Z ] }; const Kokkos::Example::FENL::Perf perf = cmd[ CMD_USE_FIXTURE_QUADRATIC ] ? Kokkos::Example::FENL::fenl< Device , Kokkos::Example::BoxElemPart::ElemQuadratic > ( comm , cmd[CMD_PRINT], cmd[CMD_USE_TRIALS], cmd[CMD_USE_ATOMIC], nelem ) : Kokkos::Example::FENL::fenl< Device , Kokkos::Example::BoxElemPart::ElemLinear > ( comm , cmd[CMD_PRINT], cmd[CMD_USE_TRIALS], cmd[CMD_USE_ATOMIC], nelem ) ; if ( 0 == comm_rank ) print_perf_value( std::cout , widths, perf ); } }
virtual void onDraw(SkCanvas* inputCanvas) override { SkScalar textSizes[] = { 9.0f, 9.0f*2.0f, 9.0f*5.0f, 9.0f*2.0f*5.0f }; SkScalar scales[] = { 2.0f*5.0f, 5.0f, 2.0f, 1.0f }; // set up offscreen rendering with distance field text #if SK_SUPPORT_GPU GrContext* ctx = inputCanvas->getGrContext(); SkImageInfo info = SkImageInfo::MakeN32Premul(onISize()); SkSurfaceProps props(SkSurfaceProps::kUseDeviceIndependentFonts_Flag, SkSurfaceProps::kLegacyFontHost_InitType); SkAutoTUnref<SkSurface> surface(SkSurface::NewRenderTarget(ctx, SkBudgeted::kNo, info, 0, &props)); SkCanvas* canvas = surface.get() ? surface->getCanvas() : inputCanvas; // init our new canvas with the old canvas's matrix canvas->setMatrix(inputCanvas->getTotalMatrix()); #else SkCanvas* canvas = inputCanvas; #endif // apply global scale to test glyph positioning canvas->scale(1.05f, 1.05f); canvas->clear(0xffffffff); SkPaint paint; paint.setAntiAlias(true); paint.setSubpixelText(true); sk_tool_utils::set_portable_typeface(&paint, "serif", SkTypeface::kNormal); const char* text = "Hamburgefons"; const size_t textLen = strlen(text); // check scaling up SkScalar x = SkIntToScalar(0); SkScalar y = SkIntToScalar(78); for (size_t i = 0; i < SK_ARRAY_COUNT(textSizes); ++i) { SkAutoCanvasRestore acr(canvas, true); canvas->translate(x, y); canvas->scale(scales[i], scales[i]); paint.setTextSize(textSizes[i]); canvas->drawText(text, textLen, 0, 0, paint); y += paint.getFontMetrics(nullptr)*scales[i]; } // check rotation for (size_t i = 0; i < 5; ++i) { SkScalar rotX = SkIntToScalar(10); SkScalar rotY = y; SkAutoCanvasRestore acr(canvas, true); canvas->translate(SkIntToScalar(10 + i * 200), -80); rotate_about(canvas, SkIntToScalar(i * 5), rotX, rotY); for (int ps = 6; ps <= 32; ps += 3) { paint.setTextSize(SkIntToScalar(ps)); canvas->drawText(text, textLen, rotX, rotY, paint); rotY += paint.getFontMetrics(nullptr); } } // check scaling down paint.setLCDRenderText(true); x = SkIntToScalar(680); y = SkIntToScalar(20); size_t arraySize = SK_ARRAY_COUNT(textSizes); for (size_t i = 0; i < arraySize; ++i) { SkAutoCanvasRestore acr(canvas, true); canvas->translate(x, y); SkScalar scaleFactor = SkScalarInvert(scales[arraySize - i - 1]); canvas->scale(scaleFactor, scaleFactor); paint.setTextSize(textSizes[i]); canvas->drawText(text, textLen, 0, 0, paint); y += paint.getFontMetrics(nullptr)*scaleFactor; } // check pos text { SkAutoCanvasRestore acr(canvas, true); canvas->scale(2.0f, 2.0f); SkAutoTArray<SkPoint> pos(SkToInt(textLen)); SkAutoTArray<SkScalar> widths(SkToInt(textLen)); paint.setTextSize(textSizes[0]); paint.getTextWidths(text, textLen, &widths[0]); SkScalar x = SkIntToScalar(340); SkScalar y = SkIntToScalar(75); for (unsigned int i = 0; i < textLen; ++i) { pos[i].set(x, y); x += widths[i]; } canvas->drawPosText(text, textLen, &pos[0], paint); } // check gamma-corrected blending const SkColor fg[] = { 0xFFFFFFFF, 0xFFFFFF00, 0xFFFF00FF, 0xFF00FFFF, 0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 0xFF000000, }; paint.setColor(0xFFF7F3F7); SkRect r = SkRect::MakeLTRB(670, 215, 820, 397); canvas->drawRect(r, paint); x = SkIntToScalar(680); y = SkIntToScalar(235); paint.setTextSize(SkIntToScalar(19)); for (size_t i = 0; i < SK_ARRAY_COUNT(fg); ++i) { paint.setColor(fg[i]); canvas->drawText(text, textLen, x, y, paint); y += paint.getFontMetrics(nullptr); } paint.setColor(0xFF181C18); r = SkRect::MakeLTRB(820, 215, 970, 397); canvas->drawRect(r, paint); x = SkIntToScalar(830); y = SkIntToScalar(235); paint.setTextSize(SkIntToScalar(19)); for (size_t i = 0; i < SK_ARRAY_COUNT(fg); ++i) { paint.setColor(fg[i]); canvas->drawText(text, textLen, x, y, paint); y += paint.getFontMetrics(nullptr); } // check skew { paint.setLCDRenderText(false); SkAutoCanvasRestore acr(canvas, true); canvas->skew(0.0f, 0.151515f); paint.setTextSize(SkIntToScalar(32)); canvas->drawText(text, textLen, 745, 70, paint); } { paint.setLCDRenderText(true); SkAutoCanvasRestore acr(canvas, true); canvas->skew(0.5f, 0.0f); paint.setTextSize(SkIntToScalar(32)); canvas->drawText(text, textLen, 580, 125, paint); } // check color emoji if (fEmojiTypeface) { paint.setTypeface(fEmojiTypeface); paint.setTextSize(SkIntToScalar(19)); canvas->drawText(fEmojiText, strlen(fEmojiText), 670, 90, paint); } #if SK_SUPPORT_GPU // render offscreen buffer if (surface) { SkAutoCanvasRestore acr(inputCanvas, true); // since we prepended this matrix already, we blit using identity inputCanvas->resetMatrix(); inputCanvas->drawImage(surface->makeImageSnapshot().get(), 0, 0, nullptr); } #endif }