-------------------------------------------------------------------------------- Build Instructions for Framebuffer NetSurf 16 March 2014 -------------------------------------------------------------------------------- This document provides instructions for building the Framebuffer version of NetSurf and provides guidance on obtaining NetSurf's build dependencies. Framebuffer NetSurf has been tested on Ubuntu and Debian. Depending on the framebuffer frontend selected the build may need specific libraries installed, e.g. the SDL port requires SDL1.2 or later There are two ways to get NetSurf building. The QUICK-START (recommended), and the manual build. Whichever you choose, you should read both the "Fonts", and "Selecting a frontend and appropriate options" sections below. Quick Start ============= See the QUICK-START document, which provides a simple environment with which you can fetch, build and install NetSurf and its dependencies. The QUICK-START is the recommended way to build NetSurf. Manual building ================= If you can't follow the quick start instructions, you will have to build NetSurf manually. The instructions for doing this are given below. Obtaining the build dependencies ---------------------------------- Many of NetSurf's dependencies are packaged on various operating systems. The remainder must be installed manually. Currently, some of the libraries developed as part of the NetSurf project have not had official releases. Hopefully they will soon be released with downloadable tarballs and packaged in common distros. For now, you'll have to make do with Git checkouts. Package installation -------------------- Debian-like OS: $ apt-get install libcurl3-dev libpng-dev Recent OS versions might need libcurl4-dev instead of libcurl3-dev but note that when it has not been built with OpenSSL, the SSL_CTX is not available and results that certification details won't be presented in case they are invalid. But as this is currently unimplemented in the Framebuffer flavour of NetSurf, this won't make a difference at all. Fedora: $ yum install curl-devel libpng-devel lcms-devel Other: You'll need to install the development resources for libcurl3 and libpng. Preparing your workspace -------------------------- NetSurf has a number of libraries which must be built in-order and installed into your workspace. Each library depends on a core build system which NetSurf projects use. This build system relies on the presence of things like pkg-config to find libraries and also certain environment variables in order to work correctly. Assuming you are preparing a workspace in /home/netsurf/workspace then the following steps will set you up: Make the workspace directory and change to it --------------------------------------------- $ mkdir -p ${HOME}/netsurf/workspace $ cd ${HOME}/netsurf/workspace Make the temporary install space -------------------------------- $ mkdir inst Make an environment script -------------------------- $ cat > env.sh <<'EOF' export PKG_CONFIG_PATH=${HOME}/netsurf/workspace/inst/lib/pkgconfig:: export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${HOME}/netsurf/workspace/inst/lib export PREFIX=${HOME}/netsurf/workspace/inst EOF Change to workspace and source the environment ---------------------------------------------- Whenever you wish to start development in a new shell, run the following: $ cd ${HOME}/netsurf/workspace $ source env.sh From here on, any commands in this document assume you have sourced your shell environment. The NetSurf project's libraries --------------------------------- The NetSurf project has developed several libraries which are required by the browser. These are: BuildSystem -- Shared build system, needed to build the other libraries LibParserUtils -- Parser building utility functions LibWapcaplet -- String internment Hubbub -- HTML5 compliant HTML parser LibCSS -- CSS parser and selection engine LibNSGIF -- GIF format image decoder LibNSBMP -- BMP and ICO format image decoder LibROSprite -- RISC OS Sprite format image decoder LibNSFB -- Framebuffer abstraction To fetch each of these libraries, run the appropriate commands from the Docs/LIBRARIES file. To build and install these libraries, simply enter each of their directories and run: $ make install | Note: We advise enabling iconv() support in libparserutils, which vastly | increases the number of supported character sets. To do this, | create a file called Makefile.config.override in the libparserutils | directory, containing the following line: | | CFLAGS += -DWITH_ICONV_FILTER | | For more information, consult the libparserutils README file. Getting the NetSurf source ---------------------------- From your workspace directory, run the following command to get the NetSurf source: $ git clone git://git.netsurf-browser.org/netsurf.git And change to the 'netsurf' directory: $ cd netsurf Building and executing NetSurf -------------------------------- First of all, you should examine the contents of Makefile.defaults and enable and disable relevant features as you see fit in a Makefile.config file. Some of these options can be automatically detected and used, and where this is the case they are set to such. Others cannot be automatically detected from the Makefile, so you will either need to install the dependencies, or set them to NO. You should then obtain NetSurf's dependencies, keeping in mind which options you have enabled in the configuration file. See the "Obtaining NetSurf's dependencies" section for specifics. Once done, to build Framebuffer NetSurf on a UNIX-like platform, simply run: $ make TARGET=framebuffer If that produces errors, you probably don't have some of NetSurf's build dependencies installed. See "Obtaining NetSurf's dependencies" below. Or turn off the complaining features in your Makefile.config. You may need to "make clean" before attempting to build after installing the dependencies. Run NetSurf by executing the "nsfb" program: $ ./nsfb | Note: NetSurf uses certain resources at run time. In order to find these | resources, it searches three locations: | | 1. ~/.netsurf/ | 2. $NETSURFRES/ | 3. /usr/share/netsurf/ | | In the build tree, the resources are located at | | framebuffer/res | | Setting $NETSURFRES to point at the resources in the build tree | will enable you to run NetSurf from here without installation. | To do this, run: | | export NETSURFRES=`pwd`/framebuffer/res Fonts ======= The framebuffer port currently has two choices for font handling. The font handler may be selected at compile time by using the NETSURF_FB_FONTLIB configuration key. Currently supported values are internal and freetype Internal ---------- The internal font system has a single built in monospaced face with CP467 encoding. The internal font plotter requires no additional resources and is very fast, it is also aesthetically unappealing. Freetype ---------- The freetype font system (freetype version 2 API is used) has support for a number of different font file formats and faces. The framebuffer font handler takes advantage of the freetype library caching system to give good performance. The font glyphs are, by default, rendered as 256 level transparency which gives excellent visual results even on small font sizes. The default font is the DejaVu trutype font set. The default path they are sourced from is /usr/share/fonts/truetype/ttf-dejavu/ . The compiled in default paths may be altered by setting values in the user configuration makefile Makefile.config. These values must be set to the absolute path of the relevant font file including its .ttf extension. The variables are: NETSURF_FB_FONT_SANS_SERIF NETSURF_FB_FONT_SANS_SERIF_BOLD NETSURF_FB_FONT_SANS_SERIF_ITALIC NETSURF_FB_FONT_SANS_SERIF_ITALIC_BOLD NETSURF_FB_FONT_SERIF NETSURF_FB_FONT_SERIF_BOLD NETSURF_FB_FONT_MONOSPACE NETSURF_FB_FONT_MONOSPACE_BOLD NETSURF_FB_FONT_CURSIVE NETSURF_FB_FONT_FANTASY The font selection may be changed by placing truetype font files in the resources path. The resource files will be the generic names sans_serif.ttf, sans_serif_bold.ttf etc. The font system is configured at runtime by several options. The fb_font_monochrome option causes the renderer to use monochrome glyph rendering which is faster to plot but slower to render and much less visually appealing. The remaining seven options control the files to be used for font faces. fb_face_sans_serif - The sans serif face fb_face_sans_serif_bold - The bold sans serif face fb_face_sans_serif_italic - The italic sans serif face fb_face_sans_serif_italic_bold - The bold italic sans serif face. fb_face_serif - The serif font fb_serif_bold - The bold serif font fb_face_monospace - The monospaced font fb_face_monospace_bold - The bold monospaced font fb_face_cursive - The cursive font fb_face_fantasy - The fantasy font Old Freetype -------------- The framebuffer port Freetype font implementation was constructed using a modern version of the library (2.3.5) to use versions 2.2.1 and prior the following patch is necessary. Index: framebuffer/font_freetype.c =================================================================== --- framebuffer/font_freetype.c (revision 6750) +++ framebuffer/font_freetype.c (working copy) @@ -311,6 +311,7 @@ FT_Glyph glyph; FT_Error error; fb_faceid_t *fb_face; + FTC_ImageTypeRec trec; fb_fill_scalar(style, &srec); @@ -318,15 +319,24 @@ glyph_index = FTC_CMapCache_Lookup(ft_cmap_cache, srec.face_id, fb_face->cidx, ucs4); - error = FTC_ImageCache_LookupScaler(ft_image_cache, - &srec, - FT_LOAD_RENDER | - FT_LOAD_FORCE_AUTOHINT | - ft_load_type, - glyph_index, - &glyph, - NULL); + trec.face_id = srec.face_id; + if (srec.pixel) { + trec.width = srec.width; + trec.height = srec.height; + } else { + /* Convert from 1/64 pts to pixels */ + trec.width = srec.width * css_screen_dpi / 64 / srec.x_res; + trec.height = srec.height * css_screen_dpi / 64 / srec.y_res; + } + trec.flags = FT_LOAD_RENDER | FT_LOAD_FORCE_AUTOHINT | ft_load_type; + + error = FTC_ImageCache_Lookup(ft_image_cache, + &trec, + glyph_index, + &glyph, + NULL); + return glyph; } Selecting a frontend and appropriate options ============================================== The framebuffer port interfaces to its input and output devices using the NetSurf Framebuffer library (libnsfb). This library provides an abstraction layer to input and output devices. The surface used by libnsfb is selected by using the -f switch to NetSurf when executed. A surface in this context is simply the combination of input and output devices. A surface output device may be any linearly mapped area of memory. The framebuffer may be treated as values at 32, 16 or 8 bits per pixel. The input device is typically selected to complement the output device and is completely specific to the surface. There are several configuration options which may influence the framebuffer surfaces. These are: fb_refresh - The refresh rate (for physical displays) fb_depth - The depth (in bits per pixel) of the framebuffer window_width - The width of the framebuffer window_height - The height of the framebuffer The defaults are for 800 by 600 pixels at 16bpp and 70Hz refresh rate. The documentation of libnsfb should be consulted for futher information about supported frontends and their configuration.