From 2504e2de84c040cd0eb955ee1d25d5042b52cd52 Mon Sep 17 00:00:00 2001 From: Anurag Thakur Date: Sat, 19 Nov 2022 10:53:24 +0530 Subject: [PATCH] [dense] Enable module compilation * src/dense/ftdense.c: Redefine FT_SWAP to fix compilation error * src/include/freetype/config/ftmodule.h: Added ft_dense_renderer_class * src/dense/dense.c: Build single object of module * modules.cfg: Added 'dense' RASTER_MODULE * src/dense/module.mk, src/dense/rules.mk: Added Makefile * CMakeLists.txt: Added 'dense.c' to compilation files --- CMakeLists.txt | 1 + include/freetype/config/ftmodule.h | 1 + modules.cfg | 3 ++ src/dense/dense.c | 5 +- src/dense/ftdense.c | 16 +++---- src/dense/module.mk | 23 ++++++++++ src/dense/rules.mk | 73 ++++++++++++++++++++++++++++++ 7 files changed, 113 insertions(+), 9 deletions(-) create mode 100644 src/dense/module.mk create mode 100644 src/dense/rules.mk diff --git a/CMakeLists.txt b/CMakeLists.txt index d31ab175d..3a2c05d4e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -405,6 +405,7 @@ set(BASE_SRCS src/cache/ftcache.c src/cff/cff.c src/cid/type1cid.c + src/dense/dense.c src/gzip/ftgzip.c src/lzw/ftlzw.c src/pcf/pcf.c diff --git a/include/freetype/config/ftmodule.h b/include/freetype/config/ftmodule.h index b315baba8..3b692aa28 100644 --- a/include/freetype/config/ftmodule.h +++ b/include/freetype/config/ftmodule.h @@ -24,6 +24,7 @@ FT_USE_MODULE( FT_Module_Class, psaux_module_class ) FT_USE_MODULE( FT_Module_Class, psnames_module_class ) FT_USE_MODULE( FT_Module_Class, pshinter_module_class ) FT_USE_MODULE( FT_Module_Class, sfnt_module_class ) +FT_USE_MODULE( FT_Renderer_Class, ft_dense_renderer_class ) FT_USE_MODULE( FT_Renderer_Class, ft_smooth_renderer_class ) FT_USE_MODULE( FT_Renderer_Class, ft_raster1_renderer_class ) FT_USE_MODULE( FT_Renderer_Class, ft_sdf_renderer_class ) diff --git a/modules.cfg b/modules.cfg index 5b6c9b5a5..cb49d79c9 100644 --- a/modules.cfg +++ b/modules.cfg @@ -93,6 +93,9 @@ HINTING_MODULES += pshinter #### raster modules -- at least one is required for vector font formats #### +# Dense Rasterizer +RASTER_MODULES += dense + # Anti-aliasing rasterizer. RASTER_MODULES += smooth diff --git a/src/dense/dense.c b/src/dense/dense.c index 6893aa715..fc0534750 100644 --- a/src/dense/dense.c +++ b/src/dense/dense.c @@ -1,3 +1,6 @@ /** For building a single object of the entire module */ +#define FT_MAKE_OPTION_SINGLE_OBJECT -/* END */ \ No newline at end of file +#include "ftdense.c" +#include "ftdenserend.c" +/* END */ diff --git a/src/dense/ftdense.c b/src/dense/ftdense.c index d2a4cde84..70c610885 100644 --- a/src/dense/ftdense.c +++ b/src/dense/ftdense.c @@ -20,7 +20,7 @@ #define UPSCALE( x ) ( ( x ) * ( ONE_PIXEL >> 6 ) ) #define DOWNSCALE( x ) ( ( x ) >> ( PIXEL_BITS - 6 ) ) -#define FT_SWAP(a, b) ( (a) ^= (b) ^=(a) ^= (b)) +#define FT_SWAP(a, b) { (a) = (a) + (b); (b) = (a) - (b); (a) = (a) - (b);} #define FT_MIN( a, b ) ( (a) < (b) ? (a) : (b) ) #define FT_MAX( a, b ) ( (a) > (b) ? (a) : (b) ) #define FT_ABS( a ) ( (a) < 0 ? -(a) : (a) ) @@ -256,17 +256,17 @@ dense_render_cubic( dense_worker* worker, FT_Vector aP2 = { control_2->x, control_2->y }; FT_Vector aP3 = { to->x, to->y }; - float devx = aP0.x - aP1->x - aP1->x + aP2->x; - float devy = aP0.y - aP1->y - aP1->y + aP2->y; + float devx = aP0.x - aP1.x - aP1.x + aP2.x; + float devy = aP0.y - aP1.y - aP1.y + aP2.y; float devsq0 = devx * devx + devy * devy; - devx = aP1->x - aP2->x - aP2->x + aP3->x; - devy = aP1->y - aP2->y - aP2->y + aP3->y; + devx = aP1.x - aP2.x - aP2.x + aP3.x; + devy = aP1.y - aP2.y - aP2.y + aP3.y; float devsq1 = devx * devx + devy * devy; float devsq = fmax( devsq0, devsq1 ); if ( devsq < 0.333f ) { - dense_render_line( worker, aP3->x, aP3->y ); + dense_render_line( worker, aP3.x, aP3.y ); return; } @@ -278,8 +278,8 @@ dense_render_cubic( dense_worker* worker, for ( int i = 0; i < n; i++ ) { t += nrecip; - FT_Vector a = Lerp( t, Lerp( t, aP0, *aP1 ), Lerp( t, *aP1, *aP2 ) ); - FT_Vector b = Lerp( t, Lerp( t, *aP1, *aP2 ), Lerp( t, *aP2, *aP3 ) ); + FT_Vector a = Lerp( t, Lerp( t, aP0, aP1 ), Lerp( t, aP1, aP2 ) ); + FT_Vector b = Lerp( t, Lerp( t, aP1, aP2 ), Lerp( t, aP2, aP3 ) ); FT_Vector next = Lerp( t, a, b ); dense_render_line( worker, next.x, next.y ); worker->prev_x = next.x; diff --git a/src/dense/module.mk b/src/dense/module.mk new file mode 100644 index 000000000..cf6b9cfac --- /dev/null +++ b/src/dense/module.mk @@ -0,0 +1,23 @@ +# +# FreeType 2 smooth renderer module definition +# + + +# Copyright (C) 1996-2021 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += DENSE_RENDERER + +define DENSE_RENDERER +$(OPEN_DRIVER) FT_Renderer_Class, ft_dense_renderer_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)dense $(ECHO_DRIVER_DESC)anti-aliased dense renderer$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/src/dense/rules.mk b/src/dense/rules.mk new file mode 100644 index 000000000..005116873 --- /dev/null +++ b/src/dense/rules.mk @@ -0,0 +1,73 @@ +# +# FreeType 2 DENSE renderer module build rules +# + + +# Copyright (C) 1996-2021 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# DENSE driver directory +# +DENSE_DIR := $(SRC_DIR)/dense + + +# compilation flags for the driver +# +DENSE_COMPILE := $(CC) $(ANSIFLAGS) \ + $I$(subst /,$(COMPILER_SEP),$(DENSE_DIR)) \ + $(INCLUDE_FLAGS) \ + $(FT_CFLAGS) + + +# DENSE driver sources (i.e., C files) +# +DENSE_DRV_SRC := $(DENSE_DIR)/ftdense.c \ + $(DENSE_DIR)/ftdenserend.c + + +# DENSE driver headers +# +DENSE_DRV_H := $(DENSE_DRV_SRC:%c=%h) \ + $(DENSE_DIR)/ftdenseerrs.h + + +# DENSE driver object(s) +# +# DENSE_DRV_OBJ_M is used during `multi' builds. +# DENSE_DRV_OBJ_S is used during `single' builds. +# +DENSE_DRV_OBJ_M := $(DENSE_DRV_SRC:$(DENSE_DIR)/%.c=$(OBJ_DIR)/%.$O) +DENSE_DRV_OBJ_S := $(OBJ_DIR)/dense.$O + +# DENSE driver source file for single build +# +DENSE_DRV_SRC_S := $(DENSE_DIR)/dense.c + + +# DENSE driver - single object +# +$(DENSE_DRV_OBJ_S): $(DENSE_DRV_SRC_S) $(DENSE_DRV_SRC) \ + $(FREETYPE_H) $(DENSE_DRV_H) + $(DENSE_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(DENSE_DRV_SRC_S)) + + +# DENSE driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(DENSE_DIR)/%.c $(FREETYPE_H) $(DENSE_DRV_H) + $(DENSE_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(DENSE_DRV_OBJ_S) +DRV_OBJS_M += $(DENSE_DRV_OBJ_M) + + +# EOF