tiny-skia 0.1.0

A stripped down Skia fork that supports only 2D shapes rendering on a CPU.
Documentation
const SKIA_FILES: &[&str] = &[
    "skia/src/core/SkAAClip.cpp",
    "skia/src/core/SkAlphaRuns.cpp",
    "skia/src/core/SkAnalyticEdge.cpp",
    "skia/src/core/SkArenaAlloc.cpp",
    "skia/src/core/SkBitmapCache.cpp",
    "skia/src/core/SkBitmapController.cpp",
    "skia/src/core/SkBitmap.cpp",
    "skia/src/core/SkBitmapDevice.cpp",
    "skia/src/core/SkBitmapProcState.cpp",
    "skia/src/core/SkBitmapProcState_matrixProcs.cpp",
    "skia/src/core/SkBlendMode.cpp",
    "skia/src/core/SkBlitRow_D32.cpp",
    "skia/src/core/SkBlitter_A8.cpp",
    "skia/src/core/SkBlitter_ARGB32.cpp",
    "skia/src/core/SkBlitter.cpp",
    "skia/src/core/SkBlitter_RGB565.cpp",
    "skia/src/core/SkBlitter_Sprite.cpp",
    "skia/src/core/SkBlurMask.cpp",
    "skia/src/core/SkBlurMF.cpp",
    "skia/src/core/SkBuffer.cpp",
    "skia/src/core/SkCachedData.cpp",
    "skia/src/core/SkCanvas.cpp",
    "skia/src/core/SkCanvasPriv.cpp",
    "skia/src/core/SkClipStack.cpp",
    "skia/src/core/SkClipStackDevice.cpp",
    "skia/src/core/SkColor.cpp",
    "skia/src/core/SkColorFilter.cpp",
    "skia/src/core/SkColorFilter_Matrix.cpp",
    "skia/src/core/SkColorSpace.cpp",
    "skia/src/core/SkColorSpaceXformSteps.cpp",
    "skia/src/core/SkContourMeasure.cpp",
    "skia/src/core/SkConvertPixels.cpp",
    "skia/src/core/SkCpu.cpp",
    "skia/src/core/SkData.cpp",
    "skia/src/core/SkDeque.cpp",
    "skia/src/core/SkDevice.cpp",
    "skia/src/core/SkDraw.cpp",
    "skia/src/core/SkEdgeBuilder.cpp",
    "skia/src/core/SkEdgeClipper.cpp",
    "skia/src/core/SkEdge.cpp",
    "skia/src/core/SkGaussFilter.cpp",
    "skia/src/core/SkGeometry.cpp",
    "skia/src/core/SkGraphics.cpp",
    "skia/src/core/SkHalf.cpp",
    "skia/src/core/SkIDChangeListener.cpp",
    "skia/src/core/SkImageFilterCache.cpp",
    "skia/src/core/SkImageFilter.cpp",
    "skia/src/core/SkImageFilterTypes.cpp",
    "skia/src/core/SkImageInfo.cpp",
    "skia/src/core/SkLatticeIter.cpp",
    "skia/src/core/SkLineClipper.cpp",
    "skia/src/core/SkLocalMatrixImageFilter.cpp",
    "skia/src/core/SkM44.cpp",
    "skia/src/core/SkMalloc.cpp",
    "skia/src/core/SkMallocPixelRef.cpp",
    "skia/src/core/SkMarkerStack.cpp",
    "skia/src/core/SkMaskBlurFilter.cpp",
    "skia/src/core/SkMaskCache.cpp",
    "skia/src/core/SkMask.cpp",
    "skia/src/core/SkMaskFilter.cpp",
    "skia/src/core/SkMath.cpp",
    "skia/src/core/SkMatrix44.cpp",
    "skia/src/core/SkMatrix.cpp",
    "skia/src/core/SkMatrixImageFilter.cpp",
    "skia/src/core/SkMipMap.cpp",
    "skia/src/core/SkModeColorFilter.cpp",
    "skia/src/core/SkOpts.cpp",
    "skia/src/core/SkPaint.cpp",
    "skia/src/core/SkPaintPriv.cpp",
    "skia/src/core/SkPath.cpp",
    "skia/src/core/SkPathEffect.cpp",
    "skia/src/core/SkPathMeasure.cpp",
    "skia/src/core/SkPathRef.cpp",
    "skia/src/core/SkPixelRef.cpp",
    "skia/src/core/SkPixmap.cpp",
    "skia/src/core/SkPoint3.cpp",
    "skia/src/core/SkPoint.cpp",
    "skia/src/core/SkQuadClipper.cpp",
    "skia/src/core/SkRasterClip.cpp",
    "skia/src/core/SkRasterPipelineBlitter.cpp",
    "skia/src/core/SkRasterPipeline.cpp",
    "skia/src/core/SkRect.cpp",
    "skia/src/core/SkRegion.cpp",
    "skia/src/core/SkRegion_path.cpp",
    "skia/src/core/SkResourceCache.cpp",
    "skia/src/core/SkRRect.cpp",
    "skia/src/core/SkScalar.cpp",
    "skia/src/core/SkScan_AAAPath.cpp",
    "skia/src/core/SkScan_Antihair.cpp",
    "skia/src/core/SkScan_AntiPath.cpp",
    "skia/src/core/SkScan.cpp",
    "skia/src/core/SkScan_Hairline.cpp",
    "skia/src/core/SkScan_Path.cpp",
    "skia/src/core/SkSemaphore.cpp",
    "skia/src/core/SkSpecialImage.cpp",
    "skia/src/core/SkSpecialSurface.cpp",
    "skia/src/core/SkSpriteBlitter_ARGB32.cpp",
    "skia/src/core/SkSpriteBlitter_RGB565.cpp",
    "skia/src/core/SkString.cpp",
    "skia/src/core/SkStroke.cpp",
    "skia/src/core/SkStrokeRec.cpp",
    "skia/src/core/SkStrokerPriv.cpp",
    "skia/src/core/SkThreadID.cpp",
    "skia/src/core/SkUnPreMultiply.cpp",
    "skia/src/core/SkVMBlitter.cpp",
    "skia/src/core/SkVM.cpp",
    "skia/src/core/SkXfermode.cpp",
    "skia/src/core/SkXfermodeInterpretation.cpp",
    "skia/src/core/SkYUVASizeInfo.cpp",

    "skia/src/effects/SkDashPathEffect.cpp",

    "skia/src/image/SkImage.cpp",
    "skia/src/image/SkImage_Raster.cpp",
    "skia/src/image/SkSurface.cpp",
    "skia/src/image/SkSurface_Raster.cpp",

    "skia/src/opts/SkOpts_avx.cpp",
    "skia/src/opts/SkOpts_crc32.cpp",
    "skia/src/opts/SkOpts_hsw.cpp",
    "skia/src/opts/SkOpts_skx.cpp",
    "skia/src/opts/SkOpts_sse41.cpp",
    "skia/src/opts/SkOpts_sse42.cpp",
    "skia/src/opts/SkOpts_ssse3.cpp",

    "skia/src/pathops/SkDCubicLineIntersection.cpp",
    "skia/src/pathops/SkPathOpsCubic.cpp",
    "skia/src/pathops/SkPathOpsQuad.cpp",
    "skia/src/pathops/SkPathOpsTypes.cpp",

    "skia/src/ports/SkDebug_stdio.cpp",
    "skia/src/ports/SkDebug_win.cpp",
    "skia/src/ports/SkMemory_malloc.cpp",

    "skia/src/shaders/gradients/Sk4fGradientBase.cpp",
    "skia/src/shaders/gradients/Sk4fLinearGradient.cpp",
    "skia/src/shaders/gradients/SkGradientShader.cpp",
    "skia/src/shaders/gradients/SkLinearGradient.cpp",
    "skia/src/shaders/gradients/SkRadialGradient.cpp",
    "skia/src/shaders/gradients/SkSweepGradient.cpp",
    "skia/src/shaders/gradients/SkTwoPointConicalGradient.cpp",

    "skia/src/shaders/SkColorFilterShader.cpp",
    "skia/src/shaders/SkColorShader.cpp",
    "skia/src/shaders/SkComposeShader.cpp",
    "skia/src/shaders/SkImageShader.cpp",
    "skia/src/shaders/SkLocalMatrixShader.cpp",
    "skia/src/shaders/SkShader.cpp",

    "skia/src/utils/SkDashPath.cpp",

    "skia/third_party/skcms/skcms.cc",

    "skia-c/skia_c.cpp",
];

fn main() {
    println!("cargo:rerun-if-env-changed=SKIA_DIR");
    println!("cargo:rerun-if-env-changed=SKIA_LIB_DIR");

    // Use clang by default since this is the recommended compiler for Skia.
    if std::env::var("CC").is_err() {
        #[cfg(target_os = "windows")]
        {
            std::env::set_var("CC", "clang-cl");
            std::env::set_var("CXX", "clang-cl");
        }

        #[cfg(not(target_os = "windows"))]
        {
            std::env::set_var("CC", "clang");
            std::env::set_var("CXX", "clang++");
        }
    }

    if std::env::var("SKIA_DIR").is_ok() {
        build_external();
    } else {
        build_embedded();
    }
}

fn build_embedded() {
    let mut build = cc::Build::new();

    build.cpp(true);

    build.files(SKIA_FILES);

    build.include("skia");
    build.include("skia/include/third_party/skcms");
    build.include("skia-c");

    #[cfg(target_os = "windows")]
    {
        build.define("SK_BUILD_FOR_WIN", "1");
    }

    if std::env::var("DEBUG").is_ok() {
        build.define("SK_DEBUG", "1");
    } else {
        build.define("SK_RELEASE", "1");
    }

    #[cfg(target_os = "windows")]
    {
        build.flag("/std:c++17");
        build.flag("-Wno-unused-function");
        build.flag("-Wno-unused-parameter");
    }

    #[cfg(not(target_os = "windows"))]
    {
        build.flag("-std=c++17");
        build.flag("-fPIC");
        build.flag("-fno-exceptions");
        build.flag("-fno-rtti");
        build.flag("-fstrict-aliasing");
        build.flag("-fvisibility=hidden");
        build.flag("-fdata-sections");
        build.flag("-ffunction-sections");
        build.flag("-fvisibility-inlines-hidden");
        build.flag("-Wno-unused-function");
        build.flag("-Wno-unused-parameter");
        build.flag("-Wno-unused-private-field");
    }

    build.compile("libskiac.a");
}

fn build_external() {
    use std::env;
    use std::path::Path;

    let skia_dir = env::var("SKIA_DIR").unwrap();
    let skia_path = Path::new(&skia_dir);

    let mut build = cc::Build::new();

    build.cpp(true);
    build.file("skia-c/skia_c.cpp");
    build.include("skia-c");
    build.include(skia_path);
    build.compile("libskiac.a");

    let skia_lib_dir = env::var("SKIA_LIB_DIR").expect("SKIA_LIB_DIR is not set");
    println!("cargo:rustc-link-search={}", skia_lib_dir);
    println!("cargo:rustc-link-lib=skia");
}