LCOV - code coverage report
Current view: top level - gfx/cairo/cairo/src - cairo-font-options.c (source / functions) Hit Total Coverage
Test: output.info Lines: 76 128 59.4 %
Date: 2017-07-14 16:53:18 Functions: 14 21 66.7 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* cairo - a vector graphics library with display and print output
       2             :  *
       3             :  * Copyright © 2005 Red Hat Inc.
       4             :  *
       5             :  * This library is free software; you can redistribute it and/or
       6             :  * modify it either under the terms of the GNU Lesser General Public
       7             :  * License version 2.1 as published by the Free Software Foundation
       8             :  * (the "LGPL") or, at your option, under the terms of the Mozilla
       9             :  * Public License Version 1.1 (the "MPL"). If you do not alter this
      10             :  * notice, a recipient may use your version of this file under either
      11             :  * the MPL or the LGPL.
      12             :  *
      13             :  * You should have received a copy of the LGPL along with this library
      14             :  * in the file COPYING-LGPL-2.1; if not, write to the Free Software
      15             :  * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA
      16             :  * You should have received a copy of the MPL along with this library
      17             :  * in the file COPYING-MPL-1.1
      18             :  *
      19             :  * The contents of this file are subject to the Mozilla Public License
      20             :  * Version 1.1 (the "License"); you may not use this file except in
      21             :  * compliance with the License. You may obtain a copy of the License at
      22             :  * http://www.mozilla.org/MPL/
      23             :  *
      24             :  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY
      25             :  * OF ANY KIND, either express or implied. See the LGPL or the MPL for
      26             :  * the specific language governing rights and limitations.
      27             :  *
      28             :  * The Original Code is the cairo graphics library.
      29             :  *
      30             :  * The Initial Developer of the Original Code is University of Southern
      31             :  * California.
      32             :  *
      33             :  * Contributor(s):
      34             :  *      Owen Taylor <otaylor@redhat.com>
      35             :  */
      36             : 
      37             : #include "cairoint.h"
      38             : #include "cairo-error-private.h"
      39             : 
      40             : /**
      41             :  * SECTION:cairo-font-options
      42             :  * @Title: cairo_font_options_t
      43             :  * @Short_Description: How a font should be rendered
      44             :  * @See_Also: #cairo_scaled_font_t
      45             :  *
      46             :  * The font options specify how fonts should be rendered.  Most of the 
      47             :  * time the font options implied by a surface are just right and do not 
      48             :  * need any changes, but for pixel-based targets tweaking font options 
      49             :  * may result in superior output on a particular display.
      50             :  */
      51             : 
      52             : static const cairo_font_options_t _cairo_font_options_nil = {
      53             :     CAIRO_ANTIALIAS_DEFAULT,
      54             :     CAIRO_SUBPIXEL_ORDER_DEFAULT,
      55             :     CAIRO_LCD_FILTER_DEFAULT,
      56             :     CAIRO_HINT_STYLE_DEFAULT,
      57             :     CAIRO_HINT_METRICS_DEFAULT,
      58             :     CAIRO_ROUND_GLYPH_POS_DEFAULT
      59             : };
      60             : 
      61             : /**
      62             :  * _cairo_font_options_init_default:
      63             :  * @options: a #cairo_font_options_t
      64             :  *
      65             :  * Initializes all fields of the font options object to default values.
      66             :  **/
      67             : void
      68          95 : _cairo_font_options_init_default (cairo_font_options_t *options)
      69             : {
      70          95 :     options->antialias = CAIRO_ANTIALIAS_DEFAULT;
      71          95 :     options->subpixel_order = CAIRO_SUBPIXEL_ORDER_DEFAULT;
      72          95 :     options->lcd_filter = CAIRO_LCD_FILTER_DEFAULT;
      73          95 :     options->hint_style = CAIRO_HINT_STYLE_DEFAULT;
      74          95 :     options->hint_metrics = CAIRO_HINT_METRICS_DEFAULT;
      75          95 :     options->round_glyph_positions = CAIRO_ROUND_GLYPH_POS_DEFAULT;
      76          95 : }
      77             : 
      78             : void
      79         108 : _cairo_font_options_init_copy (cairo_font_options_t             *options,
      80             :                                const cairo_font_options_t       *other)
      81             : {
      82         108 :     options->antialias = other->antialias;
      83         108 :     options->subpixel_order = other->subpixel_order;
      84         108 :     options->lcd_filter = other->lcd_filter;
      85         108 :     options->hint_style = other->hint_style;
      86         108 :     options->hint_metrics = other->hint_metrics;
      87         108 :     options->round_glyph_positions = other->round_glyph_positions;
      88         108 : }
      89             : 
      90             : /**
      91             :  * cairo_font_options_create:
      92             :  *
      93             :  * Allocates a new font options object with all options initialized
      94             :  *  to default values.
      95             :  *
      96             :  * Return value: a newly allocated #cairo_font_options_t. Free with
      97             :  *   cairo_font_options_destroy(). This function always returns a
      98             :  *   valid pointer; if memory cannot be allocated, then a special
      99             :  *   error object is returned where all operations on the object do nothing.
     100             :  *   You can check for this with cairo_font_options_status().
     101             :  **/
     102             : cairo_font_options_t *
     103          81 : cairo_font_options_create (void)
     104             : {
     105             :     cairo_font_options_t *options;
     106             : 
     107          81 :     options = malloc (sizeof (cairo_font_options_t));
     108          81 :     if (!options) {
     109           0 :         _cairo_error_throw (CAIRO_STATUS_NO_MEMORY);
     110           0 :         return (cairo_font_options_t *) &_cairo_font_options_nil;
     111             :     }
     112             : 
     113          81 :     _cairo_font_options_init_default (options);
     114             : 
     115          81 :     return options;
     116             : }
     117             : 
     118             : /**
     119             :  * cairo_font_options_copy:
     120             :  * @original: a #cairo_font_options_t
     121             :  *
     122             :  * Allocates a new font options object copying the option values from
     123             :  *  @original.
     124             :  *
     125             :  * Return value: a newly allocated #cairo_font_options_t. Free with
     126             :  *   cairo_font_options_destroy(). This function always returns a
     127             :  *   valid pointer; if memory cannot be allocated, then a special
     128             :  *   error object is returned where all operations on the object do nothing.
     129             :  *   You can check for this with cairo_font_options_status().
     130             :  **/
     131             : cairo_font_options_t *
     132           0 : cairo_font_options_copy (const cairo_font_options_t *original)
     133             : {
     134             :     cairo_font_options_t *options;
     135             : 
     136           0 :     if (cairo_font_options_status ((cairo_font_options_t *) original))
     137           0 :         return (cairo_font_options_t *) &_cairo_font_options_nil;
     138             : 
     139           0 :     options = malloc (sizeof (cairo_font_options_t));
     140           0 :     if (!options) {
     141           0 :         _cairo_error_throw (CAIRO_STATUS_NO_MEMORY);
     142           0 :         return (cairo_font_options_t *) &_cairo_font_options_nil;
     143             :     }
     144             : 
     145           0 :     _cairo_font_options_init_copy (options, original);
     146             : 
     147           0 :     return options;
     148             : }
     149             : 
     150             : /**
     151             :  * cairo_font_options_destroy:
     152             :  * @options: a #cairo_font_options_t
     153             :  *
     154             :  * Destroys a #cairo_font_options_t object created with
     155             :  * cairo_font_options_create() or cairo_font_options_copy().
     156             :  **/
     157             : void
     158          81 : cairo_font_options_destroy (cairo_font_options_t *options)
     159             : {
     160          81 :     if (cairo_font_options_status (options))
     161           0 :         return;
     162             : 
     163          81 :     free (options);
     164             : }
     165             : 
     166             : /**
     167             :  * cairo_font_options_status:
     168             :  * @options: a #cairo_font_options_t
     169             :  *
     170             :  * Checks whether an error has previously occurred for this
     171             :  * font options object
     172             :  *
     173             :  * Return value: %CAIRO_STATUS_SUCCESS or %CAIRO_STATUS_NO_MEMORY
     174             :  **/
     175             : cairo_status_t
     176         326 : cairo_font_options_status (cairo_font_options_t *options)
     177             : {
     178         326 :     if (options == NULL)
     179           0 :         return CAIRO_STATUS_NULL_POINTER;
     180         326 :     else if (options == (cairo_font_options_t *) &_cairo_font_options_nil)
     181           0 :         return CAIRO_STATUS_NO_MEMORY;
     182             :     else
     183         326 :         return CAIRO_STATUS_SUCCESS;
     184             : }
     185             : slim_hidden_def (cairo_font_options_status);
     186             : 
     187             : /**
     188             :  * cairo_font_options_merge:
     189             :  * @options: a #cairo_font_options_t
     190             :  * @other: another #cairo_font_options_t
     191             :  *
     192             :  * Merges non-default options from @other into @options, replacing
     193             :  * existing values. This operation can be thought of as somewhat
     194             :  * similar to compositing @other onto @options with the operation
     195             :  * of %CAIRO_OPERATION_OVER.
     196             :  **/
     197             : void
     198           2 : cairo_font_options_merge (cairo_font_options_t       *options,
     199             :                           const cairo_font_options_t *other)
     200             : {
     201           2 :     if (cairo_font_options_status (options))
     202           0 :         return;
     203             : 
     204           2 :     if (cairo_font_options_status ((cairo_font_options_t *) other))
     205           0 :         return;
     206             : 
     207           2 :     if (other->antialias != CAIRO_ANTIALIAS_DEFAULT)
     208           2 :         options->antialias = other->antialias;
     209           2 :     if (other->subpixel_order != CAIRO_SUBPIXEL_ORDER_DEFAULT)
     210           2 :         options->subpixel_order = other->subpixel_order;
     211           2 :     if (other->lcd_filter != CAIRO_LCD_FILTER_DEFAULT)
     212           0 :         options->lcd_filter = other->lcd_filter;
     213           2 :     if (other->hint_style != CAIRO_HINT_STYLE_DEFAULT)
     214           2 :         options->hint_style = other->hint_style;
     215           2 :     if (other->hint_metrics != CAIRO_HINT_METRICS_DEFAULT)
     216           2 :         options->hint_metrics = other->hint_metrics;
     217           2 :     if (other->round_glyph_positions != CAIRO_ROUND_GLYPH_POS_DEFAULT)
     218           0 :         options->round_glyph_positions = other->round_glyph_positions;
     219             : }
     220             : slim_hidden_def (cairo_font_options_merge);
     221             : 
     222             : /**
     223             :  * cairo_font_options_equal:
     224             :  * @options: a #cairo_font_options_t
     225             :  * @other: another #cairo_font_options_t
     226             :  *
     227             :  * Compares two font options objects for equality.
     228             :  *
     229             :  * Return value: %TRUE if all fields of the two font options objects match.
     230             :  *      Note that this function will return %FALSE if either object is in
     231             :  *      error.
     232             :  **/
     233             : cairo_bool_t
     234           8 : cairo_font_options_equal (const cairo_font_options_t *options,
     235             :                           const cairo_font_options_t *other)
     236             : {
     237           8 :     if (cairo_font_options_status ((cairo_font_options_t *) options))
     238           0 :         return FALSE;
     239           8 :     if (cairo_font_options_status ((cairo_font_options_t *) other))
     240           0 :         return FALSE;
     241             : 
     242           8 :     if (options == other)
     243           0 :         return TRUE;
     244             : 
     245          15 :     return (options->antialias == other->antialias &&
     246          14 :             options->subpixel_order == other->subpixel_order &&
     247          14 :             options->lcd_filter == other->lcd_filter &&
     248          14 :             options->hint_style == other->hint_style &&
     249          22 :             options->hint_metrics == other->hint_metrics &&
     250           7 :             options->round_glyph_positions == other->round_glyph_positions);
     251             : }
     252             : slim_hidden_def (cairo_font_options_equal);
     253             : 
     254             : /**
     255             :  * cairo_font_options_hash:
     256             :  * @options: a #cairo_font_options_t
     257             :  *
     258             :  * Compute a hash for the font options object; this value will
     259             :  * be useful when storing an object containing a #cairo_font_options_t
     260             :  * in a hash table.
     261             :  *
     262             :  * Return value: the hash value for the font options object.
     263             :  *   The return value can be cast to a 32-bit type if a
     264             :  *   32-bit hash value is needed.
     265             :  **/
     266             : unsigned long
     267          22 : cairo_font_options_hash (const cairo_font_options_t *options)
     268             : {
     269          22 :     if (cairo_font_options_status ((cairo_font_options_t *) options))
     270           0 :         options = &_cairo_font_options_nil; /* force default values */
     271             : 
     272          44 :     return ((options->antialias) |
     273          44 :             (options->subpixel_order << 4) |
     274          44 :             (options->lcd_filter << 8) |
     275          44 :             (options->hint_style << 12) |
     276          22 :             (options->hint_metrics << 16));
     277             : }
     278             : slim_hidden_def (cairo_font_options_hash);
     279             : 
     280             : /**
     281             :  * cairo_font_options_set_antialias:
     282             :  * @options: a #cairo_font_options_t
     283             :  * @antialias: the new antialiasing mode
     284             :  *
     285             :  * Sets the antialiasing mode for the font options object. This
     286             :  * specifies the type of antialiasing to do when rendering text.
     287             :  **/
     288             : void
     289           8 : cairo_font_options_set_antialias (cairo_font_options_t *options,
     290             :                                   cairo_antialias_t     antialias)
     291             : {
     292           8 :     if (cairo_font_options_status (options))
     293           0 :         return;
     294             : 
     295           8 :     options->antialias = antialias;
     296             : }
     297             : slim_hidden_def (cairo_font_options_set_antialias);
     298             : 
     299             : /**
     300             :  * cairo_font_options_get_antialias:
     301             :  * @options: a #cairo_font_options_t
     302             :  *
     303             :  * Gets the antialiasing mode for the font options object.
     304             :  *
     305             :  * Return value: the antialiasing mode
     306             :  **/
     307             : cairo_antialias_t
     308           0 : cairo_font_options_get_antialias (const cairo_font_options_t *options)
     309             : {
     310           0 :     if (cairo_font_options_status ((cairo_font_options_t *) options))
     311           0 :         return CAIRO_ANTIALIAS_DEFAULT;
     312             : 
     313           0 :     return options->antialias;
     314             : }
     315             : 
     316             : /**
     317             :  * cairo_font_options_set_subpixel_order:
     318             :  * @options: a #cairo_font_options_t
     319             :  * @subpixel_order: the new subpixel order
     320             :  *
     321             :  * Sets the subpixel order for the font options object. The subpixel
     322             :  * order specifies the order of color elements within each pixel on
     323             :  * the display device when rendering with an antialiasing mode of
     324             :  * %CAIRO_ANTIALIAS_SUBPIXEL. See the documentation for
     325             :  * #cairo_subpixel_order_t for full details.
     326             :  **/
     327             : void
     328           8 : cairo_font_options_set_subpixel_order (cairo_font_options_t   *options,
     329             :                                        cairo_subpixel_order_t  subpixel_order)
     330             : {
     331           8 :     if (cairo_font_options_status (options))
     332           0 :         return;
     333             : 
     334           8 :     options->subpixel_order = subpixel_order;
     335             : }
     336             : slim_hidden_def (cairo_font_options_set_subpixel_order);
     337             : 
     338             : /**
     339             :  * cairo_font_options_get_subpixel_order:
     340             :  * @options: a #cairo_font_options_t
     341             :  *
     342             :  * Gets the subpixel order for the font options object.
     343             :  * See the documentation for #cairo_subpixel_order_t for full details.
     344             :  *
     345             :  * Return value: the subpixel order for the font options object
     346             :  **/
     347             : cairo_subpixel_order_t
     348           0 : cairo_font_options_get_subpixel_order (const cairo_font_options_t *options)
     349             : {
     350           0 :     if (cairo_font_options_status ((cairo_font_options_t *) options))
     351           0 :         return CAIRO_SUBPIXEL_ORDER_DEFAULT;
     352             : 
     353           0 :     return options->subpixel_order;
     354             : }
     355             : 
     356             : /**
     357             :  * _cairo_font_options_set_lcd_filter:
     358             :  * @options: a #cairo_font_options_t
     359             :  * @lcd_filter: the new LCD filter
     360             :  *
     361             :  * Sets the LCD filter for the font options object. The LCD filter
     362             :  * specifies how pixels are filtered when rendered with an antialiasing
     363             :  * mode of %CAIRO_ANTIALIAS_SUBPIXEL. See the documentation for
     364             :  * #cairo_lcd_filter_t for full details.
     365             :  *
     366             :  * Since: 1.8
     367             :  **/
     368             : void
     369           0 : _cairo_font_options_set_lcd_filter (cairo_font_options_t *options,
     370             :                                     cairo_lcd_filter_t    lcd_filter)
     371             : {
     372           0 :     if (cairo_font_options_status (options))
     373           0 :         return;
     374             : 
     375           0 :     options->lcd_filter = lcd_filter;
     376             : }
     377             : 
     378             : /**
     379             :  * _cairo_font_options_get_lcd_filter:
     380             :  * @options: a #cairo_font_options_t
     381             :  *
     382             :  * Gets the LCD filter for the font options object.
     383             :  * See the documentation for #cairo_lcd_filter_t for full details.
     384             :  *
     385             :  * Return value: the LCD filter for the font options object
     386             :  *
     387             :  * Since: 1.8
     388             :  **/
     389             : cairo_lcd_filter_t
     390           0 : _cairo_font_options_get_lcd_filter (const cairo_font_options_t *options)
     391             : {
     392           0 :     if (cairo_font_options_status ((cairo_font_options_t *) options))
     393           0 :         return CAIRO_LCD_FILTER_DEFAULT;
     394             : 
     395           0 :     return options->lcd_filter;
     396             : }
     397             : 
     398             : /**
     399             :  * _cairo_font_options_set_round_glyph_positions:
     400             :  * @options: a #cairo_font_options_t
     401             :  * @round: the new rounding value
     402             :  *
     403             :  * Sets the rounding options for the font options object. If rounding is set, a
     404             :  * glyph's position will be rounded to integer values.
     405             :  *
     406             :  * Since: 1.12
     407             :  **/
     408             : void
     409           2 : _cairo_font_options_set_round_glyph_positions (cairo_font_options_t *options,
     410             :                                                cairo_round_glyph_positions_t  round)
     411             : {
     412           2 :     if (cairo_font_options_status (options))
     413           0 :         return;
     414             : 
     415           2 :     options->round_glyph_positions = round;
     416             : }
     417             : 
     418             : /**
     419             :  * _cairo_font_options_get_round_glyph_positions:
     420             :  * @options: a #cairo_font_options_t
     421             :  *
     422             :  * Gets the glyph position rounding option for the font options object.
     423             :  *
     424             :  * Return value: The round glyph posistions flag for the font options object.
     425             :  *
     426             :  * Since: 1.12
     427             :  **/
     428             : cairo_round_glyph_positions_t
     429           0 : _cairo_font_options_get_round_glyph_positions (const cairo_font_options_t *options)
     430             : {
     431           0 :     if (cairo_font_options_status ((cairo_font_options_t *) options))
     432           0 :         return CAIRO_ROUND_GLYPH_POS_DEFAULT;
     433             : 
     434           0 :     return options->round_glyph_positions;
     435             : }
     436             : 
     437             : /**
     438             :  * cairo_font_options_set_hint_style:
     439             :  * @options: a #cairo_font_options_t
     440             :  * @hint_style: the new hint style
     441             :  *
     442             :  * Sets the hint style for font outlines for the font options object.
     443             :  * This controls whether to fit font outlines to the pixel grid,
     444             :  * and if so, whether to optimize for fidelity or contrast.
     445             :  * See the documentation for #cairo_hint_style_t for full details.
     446             :  **/
     447             : void
     448           8 : cairo_font_options_set_hint_style (cairo_font_options_t *options,
     449             :                                    cairo_hint_style_t    hint_style)
     450             : {
     451           8 :     if (cairo_font_options_status (options))
     452           0 :         return;
     453             : 
     454           8 :     options->hint_style = hint_style;
     455             : }
     456             : slim_hidden_def (cairo_font_options_set_hint_style);
     457             : 
     458             : /**
     459             :  * cairo_font_options_get_hint_style:
     460             :  * @options: a #cairo_font_options_t
     461             :  *
     462             :  * Gets the hint style for font outlines for the font options object.
     463             :  * See the documentation for #cairo_hint_style_t for full details.
     464             :  *
     465             :  * Return value: the hint style for the font options object
     466             :  **/
     467             : cairo_hint_style_t
     468           0 : cairo_font_options_get_hint_style (const cairo_font_options_t *options)
     469             : {
     470           0 :     if (cairo_font_options_status ((cairo_font_options_t *) options))
     471           0 :         return CAIRO_HINT_STYLE_DEFAULT;
     472             : 
     473           0 :     return options->hint_style;
     474             : }
     475             : 
     476             : /**
     477             :  * cairo_font_options_set_hint_metrics:
     478             :  * @options: a #cairo_font_options_t
     479             :  * @hint_metrics: the new metrics hinting mode
     480             :  *
     481             :  * Sets the metrics hinting mode for the font options object. This
     482             :  * controls whether metrics are quantized to integer values in
     483             :  * device units.
     484             :  * See the documentation for #cairo_hint_metrics_t for full details.
     485             :  **/
     486             : void
     487          10 : cairo_font_options_set_hint_metrics (cairo_font_options_t *options,
     488             :                                      cairo_hint_metrics_t  hint_metrics)
     489             : {
     490          10 :     if (cairo_font_options_status (options))
     491           0 :         return;
     492             : 
     493          10 :     options->hint_metrics = hint_metrics;
     494             : }
     495             : slim_hidden_def (cairo_font_options_set_hint_metrics);
     496             : 
     497             : /**
     498             :  * cairo_font_options_get_hint_metrics:
     499             :  * @options: a #cairo_font_options_t
     500             :  *
     501             :  * Gets the metrics hinting mode for the font options object.
     502             :  * See the documentation for #cairo_hint_metrics_t for full details.
     503             :  *
     504             :  * Return value: the metrics hinting mode for the font options object
     505             :  **/
     506             : cairo_hint_metrics_t
     507          71 : cairo_font_options_get_hint_metrics (const cairo_font_options_t *options)
     508             : {
     509          71 :     if (cairo_font_options_status ((cairo_font_options_t *) options))
     510           0 :         return CAIRO_HINT_METRICS_DEFAULT;
     511             : 
     512          71 :     return options->hint_metrics;
     513             : }

Generated by: LCOV version 1.13