skia-sys 0.20130412.3

2D graphic library for drawing Text, Geometries, and Images. FFI bindings only.
Documentation
ifneq ($(HOST),$(TARGET))

CC ?= $(TARGET)-gcc
CXX ?= $(TARGET)-g++
AR ?= $(TARGET)-ar

else

CC ?= gcc
CXX ?= g++
AR ?= ar

endif

ifneq ("$(MSYSTEM)","")
OUT_DIR := $(shell cygpath "$(OUT_DIR)")
else
CXXFLAGS += -fPIC
endif


ifeq ($(CFG_ENABLE_DEBUG_SKIA),1)
CXXFLAGS += \
	-g \
	-DSK_DEBUG \
	-DGR_DEBUG=1 \
	-DGR_GL_LOG_CALLS=1 \
	-DGR_GL_LOG_CALLS_START=1
else
CXXFLAGS += \
	-O3 \
	-DSK_RELEASE \
	-DGR_RELEASE=1
endif

CXXFLAGS += \
	-DSK_A32_SHIFT=24 -DSK_R32_SHIFT=16 -DSK_G32_SHIFT=8 -DSK_B32_SHIFT=0 \
	-DGR_GL_USE_NEW_SHADER_SOURCE_SIGNATURE=1 \
	-I"$(DEP_FREETYPE_OUTDIR)/include" \
	-I"$(DEP_EXPAT_OUTDIR)/include" \
	-Iinclude/config \
	-Iinclude/core \
	-Iinclude/effects \
	-Iinclude/gpu \
	-Iinclude/images \
	-Iinclude/pathops \
	-Iinclude/pipe \
	-Iinclude/ports \
	-Iinclude/utils \
	-Isrc/core \
	-Isrc/image \
	-Isrc/opts \
	-Isrc/ports \
	-Isrc/sfnt \
	-Isrc/utils \
	-Ithird_party/etc1 \
	-Ithird_party/ktx \
	-iquote src/gpu \
	-I/usr/include/freetype2

USE_CLANG = $(shell $(CXX) --version|grep -c 'clang')
ifeq ($(USE_CLANG),1)
    CXXFLAGS += -Wno-c++11-extensions
endif

SKIA_CORE_CXX_SRC = \
	$(addprefix src/core/,\
		SkAAClip.cpp \
		SkAdvancedTypefaceMetrics.cpp \
		SkAlphaRuns.cpp \
		SkAnnotation.cpp \
		SkBBHFactory.cpp \
		SkBBoxHierarchyRecord.cpp \
		SkBBoxRecord.cpp \
		SkBitmap.cpp \
		SkBitmapDevice.cpp \
		SkBitmapFilter.cpp \
		SkBitmapHeap.cpp \
		SkBitmapProcShader.cpp \
		SkBitmapProcState.cpp \
		SkBitmapProcState_matrixProcs.cpp \
		SkBitmapScaler.cpp \
		SkBitmap_scroll.cpp \
		SkBlitMask_D32.cpp \
		SkBlitRow_D16.cpp \
		SkBlitRow_D32.cpp \
		SkBlitter_A8.cpp \
		SkBlitter_ARGB32.cpp \
		SkBlitter.cpp \
		SkBlitter_RGB16.cpp \
		SkBlitter_Sprite.cpp \
		SkBuffer.cpp \
		SkCanvas.cpp \
		SkChunkAlloc.cpp \
		SkClipStack.cpp \
		SkColor.cpp \
		SkColorFilter.cpp \
		SkColorTable.cpp \
		SkComposeShader.cpp \
		SkConfig8888.cpp \
		SkConvolver.cpp \
		SkCubicClipper.cpp \
		SkData.cpp \
		SkDataTable.cpp \
		SkDebug.cpp \
		SkDeque.cpp \
		SkDevice.cpp \
		SkDeviceLooper.cpp \
		SkDeviceProfile.cpp \
		SkDistanceFieldGen.cpp \
		SkDither.cpp \
		SkDraw.cpp \
		SkDrawLooper.cpp \
		SkEdgeBuilder.cpp \
		SkEdgeClipper.cpp \
		SkEdge.cpp \
		SkError.cpp \
		SkFilterProc.cpp \
		SkFilterShader.cpp \
		SkFlate.cpp \
		SkFlattenable.cpp \
		SkFlattenableSerialization.cpp \
		SkFloatBits.cpp \
		SkFloat.cpp \
		SkFont.cpp \
		SkFontDescriptor.cpp \
		SkFontHost.cpp \
		SkFontStream.cpp \
		SkGeometry.cpp \
		SkGlyphCache.cpp \
		SkGraphics.cpp \
		SkImageFilter.cpp \
		SkImageGenerator.cpp \
		SkImageInfo.cpp \
		SkInstCnt.cpp \
		SkLineClipper.cpp \
		SkLocalMatrixShader.cpp \
		SkMallocPixelRef.cpp \
		SkMask.cpp \
		SkMaskFilter.cpp \
		SkMaskGamma.cpp \
		SkMath.cpp \
		SkMatrixClipStateMgr.cpp \
		SkMatrix.cpp \
		SkMetaData.cpp \
		SkMipMap.cpp \
		SkPackBits.cpp \
		SkPaint.cpp \
		SkPaintOptionsAndroid.cpp \
		SkPaintPriv.cpp \
		SkPath.cpp \
		SkPathEffect.cpp \
		SkPathHeap.cpp \
		SkPathMeasure.cpp \
		SkPathRef.cpp \
		SkPicture.cpp \
		SkPictureFlat.cpp \
		SkPicturePlayback.cpp \
		SkPictureRecord.cpp \
		SkPictureRecorder.cpp \
		SkPictureShader.cpp \
		SkPictureStateTree.cpp \
		SkPixelRef.cpp \
		SkPoint.cpp \
		SkProcSpriteBlitter.cpp \
		SkPtrRecorder.cpp \
		SkQuadClipper.cpp \
		SkQuadTree.cpp \
		SkRasterClip.cpp \
		SkRasterizer.cpp \
		SkReadBuffer.cpp \
		SkRect.cpp \
		SkRefDict.cpp \
		SkRegion.cpp \
		SkRegion_path.cpp \
		SkRRect.cpp \
		SkRTree.cpp \
		SkScalar.cpp \
		SkScaledImageCache.cpp \
		SkScalerContext.cpp \
		SkScan_Antihair.cpp \
		SkScan_AntiPath.cpp \
		SkScan.cpp \
		SkScan_Hairline.cpp \
		SkScan_Path.cpp \
		SkShader.cpp \
		SkSpriteBlitter_ARGB32.cpp \
		SkSpriteBlitter_RGB16.cpp \
		SkStream.cpp \
		SkString.cpp \
		SkStringUtils.cpp \
		SkStroke.cpp \
		SkStrokeRec.cpp \
		SkStrokerPriv.cpp \
		SkTileGrid.cpp \
		SkTLS.cpp \
		SkTSearch.cpp \
		SkTypefaceCache.cpp \
		SkTypeface.cpp \
		SkUnPreMultiply.cpp \
		SkUtilsArm.cpp \
		SkUtils.cpp \
		SkValidatingReadBuffer.cpp \
		SkVertState.cpp \
		SkWriteBuffer.cpp \
		SkWriter32.cpp \
		SkXfermode.cpp \
	)

SKIA_EFFECTS_CXX_SRC = \
	$(addprefix src/effects/,\
		gradients/SkBitmapCache.cpp \
		gradients/SkClampRange.cpp \
		gradients/SkGradientShader.cpp \
		gradients/SkLinearGradient.cpp \
		gradients/SkRadialGradient.cpp \
		gradients/SkSweepGradient.cpp \
		gradients/SkTwoPointConicalGradient.cpp \
		gradients/SkTwoPointConicalGradient_gpu.cpp \
		gradients/SkTwoPointRadialGradient.cpp \
		Sk1DPathEffect.cpp \
		Sk2DPathEffect.cpp \
		SkAlphaThresholdFilter.cpp \
		SkArithmeticMode.cpp \
		SkAvoidXfermode.cpp \
		SkBicubicImageFilter.cpp \
		SkBitmapSource.cpp \
		SkBlurDrawLooper.cpp \
		SkBlurImageFilter.cpp \
		SkBlurMask.cpp \
		SkBlurMaskFilter.cpp \
		SkColorFilterImageFilter.cpp \
		SkColorFilters.cpp \
		SkColorMatrix.cpp \
		SkColorMatrixFilter.cpp \
		SkComposeImageFilter.cpp \
		SkCornerPathEffect.cpp \
		SkDashPathEffect.cpp \
		SkDiscretePathEffect.cpp \
		SkDisplacementMapEffect.cpp \
		SkDropShadowImageFilter.cpp \
		SkEmbossMask.cpp \
		SkEmbossMaskFilter.cpp \
		SkGpuBlurUtils.cpp \
		SkLayerDrawLooper.cpp \
		SkLayerRasterizer.cpp \
		SkLerpXfermode.cpp \
		SkLightingImageFilter.cpp \
		SkLumaColorFilter.cpp \
		SkMagnifierImageFilter.cpp \
		SkMatrixConvolutionImageFilter.cpp \
		SkMatrixImageFilter.cpp \
		SkMergeImageFilter.cpp \
		SkMorphologyImageFilter.cpp \
		SkOffsetImageFilter.cpp \
		SkPaintFlagsDrawFilter.cpp \
		SkPerlinNoiseShader.cpp \
		SkPictureImageFilter.cpp \
		SkPixelXorXfermode.cpp \
		SkPorterDuff.cpp \
		SkRectShaderImageFilter.cpp \
		SkStippleMaskFilter.cpp \
		SkTableColorFilter.cpp \
		SkTableMaskFilter.cpp \
		SkTestImageFilters.cpp \
		SkTileImageFilter.cpp \
		SkTransparentShader.cpp \
		SkXfermodeImageFilter.cpp \
	)

SKIA_GL_CXX_SRC = \
	$(addprefix src/gpu/,\
		effects/GrBezierEffect.cpp \
		effects/GrBicubicEffect.cpp \
		effects/GrConfigConversionEffect.cpp \
		effects/GrConvexPolyEffect.cpp \
		effects/GrConvolutionEffect.cpp \
		effects/GrCustomCoordsTextureEffect.cpp \
		effects/GrDashingEffect.cpp \
		effects/GrDistanceFieldTextureEffect.cpp \
		effects/GrOvalEffect.cpp \
		effects/GrRRectEffect.cpp \
		effects/GrSimpleTextureEffect.cpp \
		effects/GrSingleTextureEffect.cpp \
		effects/GrTextureDomain.cpp \
		effects/GrTextureStripAtlas.cpp \
		gl/debug/GrBufferObj.cpp \
		gl/debug/GrDebugGL.cpp \
		gl/debug/GrFrameBufferObj.cpp \
		gl/debug/GrGLCreateDebugInterface.cpp \
		gl/debug/GrProgramObj.cpp \
		gl/debug/GrShaderObj.cpp \
		gl/debug/GrTextureObj.cpp \
		gl/debug/GrTextureUnitObj.cpp \
		gl/debug/SkDebugGLContext.cpp \
		gl/GrGLAssembleInterface.cpp \
		gl/GrGLBufferImpl.cpp \
		gl/GrGLCaps.cpp \
		gl/GrGLContext.cpp \
		gl/GrGLCreateNullInterface.cpp \
		gl/GrGLDefaultInterface_native.cpp \
		gl/GrGLExtensions.cpp \
		gl/GrGLIndexBuffer.cpp \
		gl/GrGLInterface.cpp \
		gl/GrGLNoOpInterface.cpp \
		gl/GrGLPath.cpp \
		gl/GrGLProgram.cpp \
		gl/GrGLProgramDesc.cpp \
		gl/GrGLProgramEffects.cpp \
		gl/GrGLRenderTarget.cpp \
		gl/GrGLShaderBuilder.cpp \
		gl/GrGLSL.cpp \
		gl/GrGLStencilBuffer.cpp \
		gl/GrGLTexture.cpp \
		gl/GrGLUniformManager.cpp \
		gl/GrGLUtil.cpp \
		gl/GrGLVertexArray.cpp \
		gl/GrGLVertexBuffer.cpp \
		gl/GrGpuGL.cpp \
		gl/GrGpuGL_program.cpp \
		gl/GrGLNameAllocator.cpp \
		gl/SkGLContextHelper.cpp \
		gl/SkNullGLContext.cpp \
		GrAAConvexPathRenderer.cpp \
		GrAAHairLinePathRenderer.cpp \
		GrAARectRenderer.cpp \
		GrAddPathRenderers_default.cpp \
		GrAllocPool.cpp \
		GrAtlas.cpp \
		GrBitmapTextContext.cpp \
		GrBlend.cpp \
		GrBufferAllocPool.cpp \
		GrCacheID.cpp \
		GrClipData.cpp \
		GrClipMaskCache.cpp \
		GrClipMaskManager.cpp \
		GrContext.cpp \
		GrDefaultPathRenderer.cpp \
		GrDistanceFieldTextContext.cpp \
		GrDrawState.cpp \
		GrDrawTarget.cpp \
		GrEffect.cpp \
		GrGpu.cpp \
		GrGpuFactory.cpp \
		GrGpuObject.cpp \
		GrInOrderDrawBuffer.cpp \
		GrLayerCache.cpp \
		GrMemoryPool.cpp \
		GrOvalRenderer.cpp \
		GrPaint.cpp \
		GrPath.cpp \
		GrPathRendererChain.cpp \
		GrPathRenderer.cpp \
		GrPathUtils.cpp \
		GrPictureUtils.cpp \
		GrRectanizer_pow2.cpp \
		GrRectanizer_skyline.cpp \
		GrReducedClip.cpp \
		GrRenderTarget.cpp \
		GrResourceCache.cpp \
		GrSoftwarePathRenderer.cpp \
		GrStencilAndCoverPathRenderer.cpp \
		GrStencilBuffer.cpp \
		GrStencil.cpp \
		GrSurface.cpp \
		GrSWMaskHelper.cpp \
		GrTest.cpp \
		GrTextContext.cpp \
		GrTextStrike.cpp \
		GrTextureAccess.cpp \
		GrTexture.cpp \
		GrTraceMarker.cpp \
		SkGpuDevice.cpp \
		SkGr.cpp \
		SkGrFontScaler.cpp \
		SkGrPixelRef.cpp \
		SkGrTexturePixelRef.cpp \
	)

SKIA_IMAGE_CXX_SRC = \
	$(addprefix src/image/,\
		SkImage_Codec.cpp \
		SkImage.cpp \
		SkImage_Gpu.cpp \
		SkImagePriv.cpp \
		SkImage_Raster.cpp \
		SkSurface.cpp \
		SkSurface_Gpu.cpp \
		SkSurface_Raster.cpp \
	)

SKIA_OPTS_CXX_SRC_X86 = \
	$(addprefix src/opts/,\
		SkBitmapFilter_opts_SSE2.cpp \
		SkBitmapProcState_opts_SSE2.cpp \
		SkBitmapProcState_opts_SSSE3.cpp \
		SkBlitRect_opts_SSE2.cpp \
		SkBlitRow_opts_SSE2.cpp \
		SkBlurImage_opts_SSE2.cpp \
		SkMorphology_opts_SSE2.cpp \
		SkUtils_opts_SSE2.cpp \
		SkXfermode_opts_SSE2.cpp \
		opts_check_x86.cpp \
	)

SKIA_OPTS_CXX_SRC_ARM_NEON = \
	$(addprefix src/opts/,\
		memset.arm.S \
		SkBitmapProcState_opts_arm.cpp \
		SkBlitMask_opts_arm.cpp \
		SkBlitRow_opts_arm.cpp \
		SkBlurImage_opts_arm.cpp \
		SkMorphology_opts_arm.cpp \
		SkUtils_opts_arm.cpp \
		SkXfermode_opts_arm.cpp \
		memset16_neon.S \
		memset32_neon.S \
		SkBitmapProcState_arm_neon.cpp \
		SkBitmapProcState_matrixProcs_neon.cpp \
		SkBlitMask_opts_arm_neon.cpp \
		SkBlitRow_opts_arm_neon.cpp \
		SkBlurImage_opts_neon.cpp \
		SkMorphology_opts_neon.cpp \
		SkXfermode_opts_arm_neon.cpp \
	)

SKIA_OPTS_CXX_SRC_AARCH64 = \
	$(addprefix src/opts/,\
		SkBitmapProcState_opts_arm.cpp \
		SkBlitMask_opts_arm.cpp \
		SkBlitRow_opts_arm.cpp \
		SkBlurImage_opts_arm.cpp \
		SkMorphology_opts_arm.cpp \
		SkUtils_opts_none.cpp \
		SkXfermode_opts_arm.cpp \
		SkBitmapProcState_arm_neon.cpp \
		SkBitmapProcState_matrixProcs_neon.cpp \
		SkBlitMask_opts_arm_neon.cpp \
		SkBlitRow_opts_arm_neon.cpp \
		SkBlurImage_opts_neon.cpp \
		SkMorphology_opts_neon.cpp \
		SkXfermode_opts_arm_neon.cpp \
	)

SKIA_PATHOPS_CXX_SRC = \
	$(addprefix src/pathops/,\
		SkAddIntersections.cpp \
		SkDCubicIntersection.cpp \
		SkDCubicLineIntersection.cpp \
		SkDCubicToQuads.cpp \
		SkDLineIntersection.cpp \
		SkDQuadImplicit.cpp \
		SkDQuadIntersection.cpp \
		SkDQuadLineIntersection.cpp \
		SkIntersections.cpp \
		SkOpAngle.cpp \
		SkOpContour.cpp \
		SkOpEdgeBuilder.cpp \
		SkOpSegment.cpp \
		SkPathOpsBounds.cpp \
		SkPathOpsCommon.cpp \
		SkPathOpsCubic.cpp \
		SkPathOpsDebug.cpp \
		SkPathOpsLine.cpp \
		SkPathOpsOp.cpp \
		SkPathOpsPoint.cpp \
		SkPathOpsQuad.cpp \
		SkPathOpsRect.cpp \
		SkPathOpsSimplify.cpp \
		SkPathOpsTriangle.cpp \
		SkPathOpsTypes.cpp \
		SkPathWriter.cpp \
		SkQuarticRoot.cpp \
		SkReduceOrder.cpp \
	)

SKIA_SFNT_CXX_SRC = \
	$(addprefix src/sfnt/,\
		SkOTTable_name.cpp \
		SkOTUtils.cpp \
	)

SKIA_UTILS_CXX_SRC = \
	$(addprefix src/utils/,\
		SkBase64.cpp \
		SkBitmapHasher.cpp \
		SkBitSet.cpp \
		SkBoundaryPatch.cpp \
		SkCamera.cpp \
		SkCanvasStack.cpp \
		SkCanvasStateUtils.cpp \
		SkCondVar.cpp \
		SkCountdown.cpp \
		SkCubicInterval.cpp \
		SkCullPoints.cpp \
		SkDashPath.cpp \
		SkDumpCanvas.cpp \
		SkEventTracer.cpp \
		SkFrontBufferedStream.cpp \
		SkGatherPixelRefsAndRects.cpp \
		SkInterpolator.cpp \
		SkLayer.cpp \
		SkMatrix22.cpp \
		SkMatrix44.cpp \
		SkMD5.cpp \
		SkMeshUtils.cpp \
		SkNinePatch.cpp \
		SkNullCanvas.cpp \
		SkNWayCanvas.cpp \
		SkOSFile.cpp \
		SkParseColor.cpp \
		SkParse.cpp \
		SkParsePath.cpp \
		SkPathUtils.cpp \
		SkPDFRasterizer.cpp \
		SkPictureUtils.cpp \
		SkProxyCanvas.cpp \
		SkRTConf.cpp \
		SkTextureCompressor.cpp \
		SkSHA1.cpp \
	)

SKIA_THIRDPARTY_CXX_SRC = \
	$(addprefix third_party/,\
		etc1/etc1.cpp \
		ktx/ktx.cpp \
	)

ifeq (darwin,$(findstring darwin,$(TARGET)))
CXXFLAGS += \
	-Iinclude/utils/mac \
	-DSK_USE_POSIX_THREADS

SKIA_GL_CXX_SRC += \
	$(addprefix src/gpu/,\
		gl/mac/GrGLCreateNativeInterface_mac.cpp \
		gl/mac/SkNativeGLContext_mac.cpp \
	)

SKIA_PORTS_CXX_SRC = \
	$(addprefix src/ports/,\
		SkDebug_stdio.cpp \
		SkFontHost_mac.cpp \
		SkGlobalInitialization_default.cpp \
		SkImageDecoder_empty.cpp \
		SkMemory_malloc.cpp \
		SkOSFile_posix.cpp \
		SkOSFile_stdio.cpp \
		SkTLS_pthread.cpp \
	)

SKIA_FONTS_CXX_SRC =

SKIA_UTILS_CXX_SRC += \
	$(addprefix src/utils/mac/,\
		SkCreateCGImageRef.cpp \
		SkStream_mac.cpp \
	)
endif

ifeq (androideabi,$(findstring androideabi,$(TARGET)))
CXXFLAGS += \
	-DSK_BUILD_FOR_ANDROID \
	-DEGL_EGLEXT_PROTOTYPES \
	-Iplatform_tools/android/third_party/cpufeatures

# FIXME: The skia version we updated to doesn't have android FontMgr class.
# However, this was added to skia upstream recently, so next time we update
# skia this should be removed and have the android FontMgr source file added
# to the makefile.
CXXFLAGS += -DSK_FONTHOST_DOES_NOT_USE_FONTMGR=1

SKIA_GL_CXX_SRC += \
	$(addprefix src/gpu/,\
		gl/android/GrGLCreateNativeInterface_android.cpp \
		gl/android/SkNativeGLContext_android.cpp \
	)

SKIA_PORTS_CXX_SRC = \
	$(addprefix src/ports/,\
		SkDebug_android.cpp \
		SkFontConfigInterface_android.cpp \
		SkFontConfigParser_android.cpp \
		SkFontHost_FreeType.cpp \
		SkFontHost_FreeType_common.cpp \
		SkFontHost_fontconfig.cpp \
		SkGlobalInitialization_default.cpp \
		SkImageDecoder_empty.cpp \
		SkMemory_malloc.cpp \
		SkOSFile_posix.cpp \
		SkOSFile_stdio.cpp \
		SkTLS_pthread.cpp \
	)

SKIA_FONTS_CXX_SRC =

SKIA_UTILS_CXX_SRC += \
	$(addprefix platform_tools/android/third_party/cpufeatures/,\
		cpu-features.c \
	)

else

ifeq (linux,$(findstring linux,$(TARGET)))
SKIA_GL_CXX_SRC += \
	$(addprefix src/gpu/,\
		gl/unix/GrGLCreateNativeInterface_unix.cpp \
		gl/unix/SkNativeGLContext_unix.cpp \
	)

SKIA_PORTS_CXX_SRC = \
	$(addprefix src/ports/,\
		SkDebug_stdio.cpp \
		SkFontConfigInterface_direct.cpp \
		SkFontHost_FreeType.cpp \
		SkFontHost_FreeType_common.cpp \
		SkFontHost_fontconfig.cpp \
		SkGlobalInitialization_default.cpp \
		SkImageDecoder_empty.cpp \
		SkMemory_malloc.cpp \
		SkOSFile_posix.cpp \
		SkOSFile_stdio.cpp \
		SkTLS_pthread.cpp \
	)

SKIA_FONTS_CXX_SRC = \
	$(addprefix src/fonts/,\
		SkFontMgr_fontconfig.cpp \
	)
endif

endif

ifeq (windows,$(findstring windows,$(TARGET)))
# gnu++0x is needed because we need decltype() in SkDWrite.cpp,
# but we can't use c++0x because that defines __STRICT_ANSI__,
# which causes stuff like the mingw/windows-specific float.h/math.h
# stuff like _finite() to not get declared.
CXXFLAGS += \
	-std=gnu++0x \
	-Wno-deprecated-declarations \
	-D_WIN32_WINNT=0x0600 \
	-DSK_BUILD_FOR_WIN32 \
	-DSK_INCLUDE_FREETYPE \
	-Iinclude/utils/win

ifeq ("$(MSYSTEM)","MINGW64")
CXXFLAGS += \
	-I/mingw64/include/freetype2
endif

SKIA_GL_CXX_SRC += \
	$(addprefix src/gpu/,\
		gl/win/GrGLCreateNativeInterface_win.cpp \
		gl/win/SkNativeGLContext_win.cpp \
	)

SKIA_PORTS_CXX_SRC = \
	$(addprefix src/ports/,\
		SkDebug_win.cpp \
		SkFontConfigInterface_direct.cpp \
		SkFontHost_win.cpp \
		SkFontHost_FreeType.cpp \
		SkFontHost_FreeType_common.cpp \
		SkFontHost_fontconfig.cpp \
		SkGlobalInitialization_default.cpp \
		SkImageDecoder_empty.cpp \
		SkMemory_malloc.cpp \
		SkOSFile_win.cpp \
		SkOSFile_stdio.cpp \
		SkTLS_win.cpp \
	)

SKIA_FONTS_CXX_SRC = \
	$(addprefix src/fonts/,\
		SkFontMgr_fontconfig.cpp \
	)

SKIA_UTILS_CXX_SRC += \
	$(addprefix src/utils/win/,\
		SkAutoCoInitialize.cpp \
		SkDWrite.cpp \
		SkHRESULT.cpp \
		SkIStream.cpp \
		SkWGL_win.cpp \
	)
endif

SKIA_SRC = \
	src/skia-c.cpp \
	$(SKIA_CORE_CXX_SRC) \
	$(SKIA_EFFECTS_CXX_SRC) \
	$(SKIA_FONTS_CXX_SRC) \
	$(SKIA_GL_CXX_SRC) \
	$(SKIA_IMAGE_CXX_SRC) \
	$(SKIA_PATHOPS_CXX_SRC) \
	$(SKIA_PORTS_CXX_SRC) \
	$(SKIA_SFNT_CXX_SRC) \
	$(SKIA_THIRDPARTY_CXX_SRC) \
	$(SKIA_UTILS_CXX_SRC)

ifeq (i686,$(findstring i686,$(TARGET)))
	supports_sse = true
endif
ifeq (x86_64,$(findstring x86_64,$(TARGET)))
	supports_sse = true
endif
ifeq (true,$(supports_sse))
	SKIA_SRC += \
		$(SKIA_OPTS_CXX_SRC_X86)
	PROCESSOR_EXTENSION_CXXFLAGS += \
		-msse2 \
		-mfpmath=sse
endif

ifeq (arm,$(findstring arm,$(TARGET)))
	SKIA_SRC += \
		$(SKIA_OPTS_CXX_SRC_ARM_NEON)
	PROCESSOR_EXTENSION_CXXFLAGS += \
		-mfpu=neon \
		-D__ARM_HAVE_OPTIONAL_NEON_SUPPORT

	# FIXME: Need more advanced detection of FP support
	ifeq (eabihf,$(findstring eabihf,$(TARGET)))
		PROCESSOR_EXTENSION_CXXFLAGS += \
			-mfloat-abi=hard
	else
		PROCESSOR_EXTENSION_CXXFLAGS += \
			-mfloat-abi=softfp
	endif

	ifneq ($(HOST),$(TARGET))
		# FIXME: Assumes armv7 for cross compile
		PROCESSOR_EXTENSION_CXXFLAGS += \
			-march=armv7-a \
			-mthumb
	endif
endif

ifeq (aarch64,$(findstring aarch64,$(TARGET)))
	SKIA_SRC += \
		$(SKIA_OPTS_CXX_SRC_AARCH64)
	PROCESSOR_EXTENSION_CXXFLAGS += \
		-D__ARM_HAVE_NEON
endif

SKIA_OBJS1 = $(patsubst %.cpp,$(OUT_DIR)/%.o,$(SKIA_SRC))
SKIA_OBJS2 = $(patsubst %.c,$(OUT_DIR)/%.o,$(SKIA_OBJS1))
SKIA_OBJS = $(patsubst %.S,$(OUT_DIR)/%.o,$(SKIA_OBJS2))

.PHONY: all
all: $(OUT_DIR)/libskia.a

$(OUT_DIR)/src/ports/SkAtomics_sync.h: src/ports/*.h
	mkdir -p $(OUT_DIR)/src/ports
	cp src/ports/*.h $(OUT_DIR)/src/ports

# opts_check_x86.cpp should not be build with SSE2 instructions enabled, as it is
# used to check for whether the processor supports SSE2 instructions. So we do not
# activate any processor extensions when building the file.
$(OUT_DIR)/%opts_check_x86.o: %opts_check_x86.cpp $(OUT_DIR)/src/ports/SkAtomics_sync.h
	mkdir -p `dirname $@` && $(CXX) -c $(CXXFLAGS) -o $@ $<

# Files that are suffixed in SSE3 require SSE3 to compile, but we cannot rely on
# those extensions for all processors. We only enable those extensions when compiling
# that file. Skia will not call the code if it does not detect SSE3 support
# at runtime.
$(OUT_DIR)/%SSE3.o: %SSE3.cpp $(OUT_DIR)/src/ports/SkAtomics_sync.h
	mkdir -p `dirname $@` && $(CXX) -c $(CXXFLAGS) $(PROCESSOR_EXTENSION_CXXFLAGS) -mssse3 -o $@ $<

$(OUT_DIR)/%.o: %.cpp $(OUT_DIR)/src/ports/SkAtomics_sync.h
	mkdir -p `dirname $@` && $(CXX) -c $(CXXFLAGS) $(PROCESSOR_EXTENSION_CXXFLAGS) -o $@ $<

$(OUT_DIR)/%.o: %.c $(OUT_DIR)/src/ports/SkAtomics_sync.h
	mkdir -p `dirname $@` && $(CC) -c $(CXXFLAGS) $(PROCESSOR_EXTENSION_CXXFLAGS) -o $@ $<

$(OUT_DIR)/%.o: %.S $(OUT_DIR)/src/ports/SkAtomics_sync.h
	mkdir -p `dirname $@` && $(CXX) -c $(CXXFLAGS) $(PROCESSOR_EXTENSION_CXXFLAGS) -o $@ $<

$(OUT_DIR)/libskia.a: $(SKIA_OBJS) src/skia-c.h
	cp -R include $(OUT_DIR)
	cp src/skia-c.h $(OUT_DIR)/include
	cd $(OUT_DIR) && $(AR) rcs $(subst $(OUT_DIR)/,,$@) $(subst $(OUT_DIR)/,,$(SKIA_OBJS))